JVM专题 3:Full GC 触发条件
2018-12-25 本文已影响0人
北交吴志炜
一共5种场景
1.System.gc()
程序中显式的调用System.gc(),有可能会触发Full GC。(比如NIO中的直接内存使用)使用-XX:-+DisableExplicitGC 参数,可以禁用。
2.老年代空间不足
这个空间不足有两种,一种是分配一个对象,空间真的不足。另一种是由于内存碎片,导致没有连续内存空间来分配给对象。
3.CMS GC时出现空间分配担保失败和concurrent mode failure
promotion failed 空间分配担保失败 ,Minor GC之前,会比较“老年代剩余空间”与“新生代所有对象之和”的大小,如果老年代剩余空间大于新生代之和,则本次Minor GC一定是安全的,反之,去看参数是否允许担保失败,不允许,则会触发一次Full GC
concurrent mode failure CMS无法处理浮动垃圾,因为CMS运行和程序运行是并行的,标记之后产生的垃圾cms处理不了,此时程序如果申请一块儿空间,内存不够,就会发生concurrent mode failure 。此时虚拟机会启用serial old收集器来进行老年代的回收,停顿时间会很长。
4.之前历次minorGC晋升到老年代的对象平均大小如果大于此时老年代的剩余空间,也会导致一次Full GC。
5.metaspace空间不足也会造成Full GC。