菜鸟教程JVM优化,看一篇就够了!

yong gc 的触发时机

当要分配新对象,但新生代edent区不足

将edent区和suvivor区的存活对象拷贝到另外一个survivor区

1)内存充足则,没事

2)如果内存不足,则存活对象直接进入老年代

full gc的触发时机

当对象要进入老年代时机:

1)对象年龄达到15岁后则进入老年代

2)动态年龄判断

3)分配新对象时,大对象直接进入老年代

4)空间担保机制,yong gc后存活对象无法放入survivor区,则会进入老年代

触发full gc时机这是以上情况对象进入老年代,老年代内存使用率超过了92%(所以也是内存不足),也要直接触发Old GC

当然这个比例是可以通过参数调整的

所谓的JVM优化,就是尽可能避免对象进入老年代,上面的4点,

1)尤其是第4点,避免存活对象无法进入suvivor区,适当调整suvivor区大小让存活对象只留在这里;

2)在第1)优化后,suvivor存活的对象可能在下次进行GC时候,还是存活着,那就可能会触发大年龄;

尽量进行下次GC的时候,让之前suvivor区存活的对象也被这次回收掉,不然可能会引起suvivor区存活的对象累计大小不断叠加,最终又会引起suvivor区不足让存活对象进入老年代

2)如果调整suvivor区不管怎么调整,还是无法让存活对象进入survivor区,只能加内存了

空间担保机制

每次young gc前都会进行检查,老年代空间的可用空间大小是否大于新生代所有对象的的大小

1)大于,则直接可以yong gc,因为毕竟即使所有对象都存活,直接进入老年代也能放进去

2)否,则看是否开启空间担保机制

1)不开启,直接出发Full GC

2)开启,检测老年代可用空间大小是否大于每次yong gc后进入老年代的对象的平均大小

1)否,则直接出发full gc

2)大于,则直接进行young gc

1)yong gc后存活对象小于survivor区,存活对象就进入survivor区

2)yong gc后存活对象大于survivor区,同时又小于老年代可用大小,则进入老年代

3)yong gc后存活对象大于survivor区,同时又大于老年代可用大小,则出发full gc

1)此时yong gc时候,存活对象会先留在新生代,等老年代执行full gc后腾出空间后,再把存活对象放进老年代

2)如果full gc后,老年代空间还是无法放入young gc后的存活对象,则会OOM内存溢出

猜你喜欢

转载自blog.csdn.net/qq_28394359/article/details/105774507
今日推荐