Full GC的发生条件:
Full GC
一般来说指的是全堆和方法区的垃圾收集。
从大的方面来说,Full GC
发生的条件主要可以分为两类。
- 因为对象在自然情况下到达老年代导致的老年代空间不足
- 对象熬过15次垃圾收集,到达晋升到老年代的标准,而晋升到老年代,而老年代的空间不足以放下这些内容,会触发
Full GC
- 由于对象动态年龄判定,而晋升到老年代
- 大对象直接进入老年代, 而导致的空间不足
- 空间分配担保, 在进行
GC
时,最坏的情况是此时Survivor区的对象全部存活着,则to0区和survivor的对象要进入老年代。所以,在进行minor Gc前要检查老年代的最大连续可用空间是否大于年轻代的所有对象总和,如果大于,则可以确保这次垃圾收集是安全的。如果不大于,并且不允许空间分配担保,则要进行Full Gc. 如果不大于,且允许进行空间分配担保,再看看是否大于历次晋升的平均大小,如果大于,则进行一次有“风险”的Minor GC。否则进行Full GC。- 在jdk1.6后,空间分配担保与这个参数无关。只要老年代最大连续可用空间大于新生代对象的大小或者平均大小,就会进行
minor gc
- 在jdk1.6后,空间分配担保与这个参数无关。只要老年代最大连续可用空间大于新生代对象的大小或者平均大小,就会进行
- 对象熬过15次垃圾收集,到达晋升到老年代的标准,而晋升到老年代,而老年代的空间不足以放下这些内容,会触发
- 因为在一些特殊情况下的空间不足导致的。
- 在
CMS
垃圾收集器中,由于浮动垃圾的出现,会预留一部分的老年代空间用来承载运行中的用户程序。当达到这个设定的阈值之后,会进行Full GC
。 CMS
是基于标记-清除算法的,会产生内存碎片问题,当进行若干次GC后,会进行一次Full GC
用来合并内存空间。
- 在
吞 吐 量 = 运 行 用 户 代 码 时 间 用 户 代 码 时 间 + G C 时 间 = 1 − G C 时 间 总 时 间 吞吐量=\frac{运行用户代码时间}{用户代码时间+GC时间}=1-\frac{GC时间}{总时间} 吞吐量=用户代码时间+GC时间运行用户代码时间=1−总时间GC时间 停顿时间越短,则需要调整小新生代,吞吐量也可能会下降。