简洁易懂好记最全Minor GC与Full GC分别在什么时候发生?
Minor GC:新生代GC,发生在新生代的垃圾回收动作,因为新生代创建对象频繁,所以Minor GC频繁且快。
Full GC:老年代GC,发生在老年代的垃圾回收动作,一般来说消耗时间要比Minor GC慢得多,而且往往伴随着Minor GC的发生。
1.Minor GC什么时候发生?
总的来说,当新生代空间不足时会触发Minor GC,具体有以下两种情况:
- 当Eden区满了的时候,或者要创建的对象大小>Eden区剩余空间大小,会触发Minor GC,而且分配率越高,越频繁进行Minor GC。
- Full GC有可能会触发Minor GC。
2.Full GC什么时候发生?
当老年代空间不足时会触发Full GC,具体有以下几种情况:
- Minor GC后存活对象晋升老年代,由于悲观策略,有两种情况会触发Full GC:
(1):之前每次晋升对象的平均大小>老年代剩余空间大小
(2):Minor GC后存活对象大小>老年代剩余空间大小
这两种情况都是因为老年代为新生代做内存分配担保,对新生代对象晋升担保,但是每次晋升后对象的大小是无法预测的,只能基于统计,(1)是基于历史平均水平,(2)是基于下次晋升对象的最大水平。这两种情况都属于promotion failure. - 新生代直接晋升老年代的大对象大小>老年代剩余空间大小。
- 持久代空间不足
- System.gc()会触发Full GC