何时触发YoungGC或FullGC
YoungGC的触发时常在发生,当新生代的Eden区满了之后就会触发YoungGC。
FullGC在多个情况下都会被触发:
1、发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,此时会触发FullGC
2、当老年代没有足够空间存放对象时,会触发一次FullGC
3、如果元空间区域的内存达到了所设定的阈值-XX:MetaspaceSize=,也会触发FullGC。
4.显式调用System.gc() 或者Runtime.gc()
几个触发老年代FULL GC的时机
1、老年代可用内存小于新生代全部对象的大小,如果没开启空间担保参数,会直接触发Full GC,所以一般空间担保参数都会打开。
2、老年代可用内存小于历次新生代GC后进入老年代的平均对象大小,此时会提前Full GC;但是"-XX:HandlePromotionFailure"参数,在JDK 1.6以后就被废弃了,所以现在一般都不会在生产环境里设置这个参数了。在JDK 1.6以后,只要判断"老年代可用空间"大于"新生代对象总和"或者"老年代可用空间"大于"历次Minor GC升入老年代对象的平均大小",两个条件满足一个,就可以直接进行Minor GC,不需要提前触发Full GC了。
3、是新生代Minor GC后的存活对象大于Survivor,那么就会进入老年代,此时老年代内存不足,触发Full GC。这里的不足就是判断条件后还是不足或者经过判断后进行YGC后放入老年代此时的空间不足,然后进行Full GC,就会出现频繁Full GC。达到一定情况后,就会OOM了。
4、是如果用的是CMS收集器,老年代可用内存大于历次新生代GC后进入老年代的对象平均大小,但是老年代已经使用的内存空间超过了("-XX:CMSInitiatingOccupancyFaction=92%"JDK6默认值 )这个参数指定的比例,也会自动触发Full GC。
Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC 一文搞懂
JVM young gc和full gc触发条件_younggc触发条件-CSDN博客
JVM:29 面试题:Young GC和Full GC分别在什么情况下会发生?_young gc 情况-CSDN博客
各类GC及触发条件_concurrent gc-CSDN博客