NOTE
7.6 调优思路
1. 调优的目的 减少Full GC的次数/降低Full GC耗时/降低内存占用 所谓JVM优化,就是尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收 2. 生产上整体步骤 2.1. 观察应用的G
这是历史学习笔记,可能存在过时或不完整的理解。
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日志
-
如果有以下现象发生那么需要优化:
- 每次垃圾回收的时间越来越长,由之前的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情况
- 使用jps查看进程
- 可以使用jstat实时查看gc情况 性能分析工具.md
3.4. 根据需要调优
- 如果FullGC次数太多或者太频繁,那么调优JVM参数。参考:JVM参数调优.md
- 如果内存占用一直往上而不是折线说明由内存泄漏,那么打印内存Dump分析。参考:如何排查线上问题 1. 内存占用100% / 内存问题(原链接已失效)
- 根据情况优化架构->代码->数据库->JVM->操作系统。参考:如何优化项目.md(原链接已失效)
4. CMS调优流程图
