到底什么时候会尝试触发MinorGC?
在新生代的Eden区域满了之后就会触发,采用复制算法来回收新生代的垃圾
触发MinorGC之前会如何检查老年代大小,涉及哪几个步骤和条件?
先判断新生代中所有对象的大小是否小于老年代的可用区域 true则触发Minor GC,false则继续进行下面2中的判断
如果设置了-XX:HandlePromotionFailure这个参数,那么进入第3步 如果没有设置-XX:HandlePromotionFailure参数,那么触发FullGC
判断Minor GC历次进入老年代的平均大小是否小于老年代的可用区域true则触发Minor GC,false则会触发FullGC
什么时候在Minor GC之前就会提前触发一次Full GC?
当判断新生代历次进入老年代对象的平均大小大于老年代的可用区域就会触发一次FullGC,让老年代腾出一些空间,腾出空间后再进行MinorGC。
MinorGC过后可能对应哪几种情况?
Minor GC前先判断:存活的对象所占的内存空间 < Survivor区域内存空间的大小,那么存活的对象进入Survivor区。
Minor GC前先判断:Survivor区域内存空间的大小 < 存活的对象所占的内存空间 < 老年代的可用空间大小。 那么存活的对象,直接进入老年代。
Minor GC前先判断: (存活的对象所占的内存空间 > Survivor区域内存空间的大小) && (存活的对象所占的内存空间 > 老年代的可用空间大小)。那么会触发FullGC,老年代腾出空间后,再进行MinorGC。如果腾出空间后还不能存放存活的对象,那么会导致OOM即堆内存空间不足、堆内存溢出。
哪些情况下Minor GC后的对象会进入老年代?
Survivor区 < 存活对象占用的空间 && 老年代可用区域 > 存活对象占用的空间
经过XX:MaxTenuringThreshold次M
parnew+cms的gc,如何保证只做ygc,jvm参数如何配置?
上线系统之后,观察每秒钟会新增多少对象在新生代里,然后多长时间触发一次Minor GC,平均每次MInor GC之后会有多少对象存活,Survivor区是否可以放的下。
必须让Survivor区放下,而且不能因为动态年龄判定规则直接升入老年代。然后只要Survivor区可以放下,那么下次 Minor GC后还是存活这么多对象,依然可以在另外一块Survivor区放下,基本就不会有对象升入老年代里去。
避免FullGC的方式
保证老年代可用空间大于新生代所有对象,避免MinorGC前进行FullGC
如果1可以保证,那后面-XX:HandlePromotionFailure、进入老年代的对象平均大小等比较就不需要考虑了
保证MinorGC后存活对象不大于Survivor空间
避免年轻代对象进入老年代的方式
根据实际情况查看每次MinorGC后存活对象的大小,设置合适的Survivor区域大小,保证存活对象进入survivor 区,而不是进入老年代
根据对象存活的时间以及MinorGC的间隔时间,确定年龄。比如:3分钟一次MinorGC,而对象可以存活1个小 时,那就把对象年龄设置到20,避免对象15岁进入老年代
大对象如果偶尔创建一个,可以设置-XX:PretenureSizeThreshold,使其分配至年轻代。如果创建销毁频繁,就 让其直接进入老年代,利用对象池避免频繁创建销毁
几个触发老年代GC的时机
老年代可用内存小于新生代全部对象的大小,如果没开启空间担保参数,会直接触发Full GC,所以一般空间担保参数都会打开;
老年代可用内存小于历次新生代GC后进入老年代的平均对象大小,此时会提前Full GC;
新生代Minor GC后的存活对象大于Survivor,那么就会进入老年代,此时老年代内存不足。
-XX:CMSInitiatingOccupancyFaction CMS垃圾回收时如果老年代已使用空间超过这个比例也会FULLGC。
动态年龄判断
年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区 域的50%,此时就会把年龄n以上的对象都放入老年代。
空间担保
如果老年代可用空间小于新生代对象大小,检查-XX:HandlePromotionFailure是否打开(一般打开),打开后就会看老年代空间大小是否小与历次进升的平均大小。
评论区