JVM GC优化思路

JVM的GC一般分为Young GC和Full GC,而Full GC由于STW(stop the world)需要消耗的时间一般情况比Young GC要多很多,所以GC优化思路是尽量减少Full GC的频率,减少STW以提升性能。

现在我们知道了JVM优化的方向是减少Full GC的频率,要减少Full GC的频率必然要知道对象是如何进入老年代的。

那么我们先考虑几个问题,Young GC、Full GC何时触发?对象如何进入老年代?

1、Young GC何时触发?

当新生代Eden区或者Survivor区空间不足时会触发Young GC。

2、Full GC何时触发?

1.老年代可用空间小于新生代存活对象所占空间,如果没有开启空间担保参数直接触发Full GC。

2.老年代可用空间小于新生代平均进入老年代的大小,提前触发Full GC。

3.新生代Young GC后的存活对象大于Survivor直接进入老年代,老年代内存不足触发Full GC。

3、对象如何进入老年代?

1.躲过15次GC,达到15岁高龄之后进入老年代。

2.动态年龄判定规则,如果Survivor区域 年龄1+...+年龄n 对象总和大于Survivor区域的50%,此时年龄n以上的对象会进入老年代,不一定要达到15岁。

3.如果一次Young GC后存活对象太多无法进入Survivor区域,直接进入老年代。

4.大对象直接进入老年代。

4、JVM GC优化

现在我们知道了JVM GC优化的方向是让对象尽可能的存活在新生代进行Young GC,那么我们根据第三个问题 对象如何进入老年代 来进行针对性的优化。

JVM年龄和大对象直接进入老年代一般优化系数比较低。

主要优化的是动态年龄判定规则对象超过Survivor区域50%进入老年代和Young GC过后存活对象太多无法进入Survivor区域直接进入老年代这两种情况。

也就是说一次Young GC过后存活的对象可以放入一个Survivor并且尽量不要大于Survivor的50%。

主要设置的参数是新生代的内存大小以及新生代Eden和Survivor的比例,具体大小需要根据JVM GC日志情况来具体设计,这些内容不在本篇文章中,后续会有具体分析。

代码交流 2021