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回收后,哪些年龄代的对象刷新到老年代)

 

posted @ 2019-02-19 11:36  lion_eagle  阅读(493)  评论(0编辑  收藏  举报