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内存溢出