JVM GC 调优实践总结
JVM 调优不能一概而论,需要根据不同的应用场景来确定调优方案;
1、先分析应用的特点,是高吞吐,还是高并发类型的应用
2、根据应用类型尝试调整部分参数,观察GC情况和应用性能指标
3、最终确认参数
调优的主要目的:
1、减少FULL GC
现在大多版本的JVM还使用 CMS,CMS 分为4个阶段:初始化标记(STW,要寻找根节点),并发标记,再一次标记(STW,找漏网的对象),并发清理;
其中初始化标记和再一次标记(remark)都会stop the world,另外两个步骤是并发的;
所以我们调优的第一步是如何尽量减少触发 CMS的老年代GC,只有尽量减少对象进入老年代了;
2、尽量使用效率高的GC回收算法
GC 算法一般有3种,标记-清理,标记-整理-清理,标记-复制-清理
标记-清理,内存需要少,有碎片,效率高
标记-整理-清理,内存需要少,没碎片,效率低
标记-复制-清理,内存需要多,没碎片,效率高
所以我们一般在回收时尽量会采用第一种和第三种算法,第二种作为兜底算法;
标记-清理 目前一般使用在老年代,老年代内存多,可以规避回收后内存碎片带来的空间不足的问题;内存不足时再使用整理-清理算法;
标记-复制-清理 目前一般使用在年轻代,效率高,没碎片(年轻代内存少,需要空间利用率高);
综合以上分析,我们一般调优的主要策略一般会:
1、使用效率高的算法,可以使用CMS/G1等
2、减少对象去老年代
年轻代回收算法效率高;
年轻代回收时不会STW;
增大年轻代内存,特别是调整survivor区的大小(survivor区大小会影响年轻代minor回收后,哪些年龄代的对象刷新到老年代)