NOTE

7.6 调优思路

1. 调优的目的 减少Full GC的次数/降低Full GC耗时/降低内存占用 所谓JVM优化,就是尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收 2. 生产上整体步骤 2.1. 观察应用的G

Java创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 调优的目的

减少Full GC的次数/降低Full GC耗时/降低内存占用

所谓JVM优化,就是尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收

2. 生产上整体步骤

2.1. 观察应用的GC情况

2.1.1. 加上jvm参数打印GC日志

-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:gctest.log

2.1.2. 分析GC日志

GC日志分析.md

  • 如果有以下现象发生那么需要优化:

    • 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s
    • FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC
    • 年老代的内存越来越大并且每次FullGC后年老代没有内存被释放
  • 如果有以下现象发生那么不需要优化:

    • Minor GC执行时间不到50ms;
    • Minor GC执行不频繁,约10秒一次;
    • Full GC执行时间不到1s;
    • Full GC执行频率不算频繁,不低于10分钟1次;

2.2. 如果是内存泄漏:打印并分析Dump文件

参考:如何排查线上问题 1. 内存占用100% / 内存问题(原链接已失效)

2.3. 如果是JVM参数不合理:调整JVM参数

参考:JVM参数调优.md

3. 基于JMeter压测调优

3.1. 计算每台机器QPS

假设高峰期600 0000个请求,分散到3个小时内,由两台机器,那么每台机器每秒需要承载6000/2/3/60/60=280个请求。 每个请求创建的对象大概为500Bytes,那么每秒产生的对象占用的内存空间为280*500=136KB。 我们扩大10-20倍为整个系统的请求,占用2.7MB左右 假设机器有4G内存,设置给JVM为2G内存,那么新生代700M左右,Eden+from区占用630M,也就是说经过630/2.7=233s=3分钟之后会触发GC

3.2. 使用Jmeter压测

模仿每秒280个请求压测

3.3. 观察GC情况

  1. 使用jps查看进程
  2. 可以使用jstat实时查看gc情况 性能分析工具.md

3.4. 根据需要调优

  1. 如果FullGC次数太多或者太频繁,那么调优JVM参数。参考:JVM参数调优.md
  2. 如果内存占用一直往上而不是折线说明由内存泄漏,那么打印内存Dump分析。参考:如何排查线上问题 1. 内存占用100% / 内存问题(原链接已失效)
  3. 根据情况优化架构->代码->数据库->JVM->操作系统。参考:如何优化项目.md(原链接已失效)

4. CMS调优流程图

5. 参考