赞
踩
GC又分为 minor GC 和 Full GC (也称为 Major GC )
minor GC:轻GC
Full GC(Major GC):重GC
Major GC的速度一般会比Minor GC慢十倍以上
- 程序调用System.gc时可以触发,也不是立即触发,只是发了个通知要触发,时机由jvm自行调度
- 系统自身来决定GC触发的时机,根据各区域内存大小以及垃圾回收器的参数设置
java对堆分成了几个逻辑区域,其中新生代分为Eden,幸存者区,当新生代的Eden区满时,就会触发Minor GC
因为Java对象大多都具有朝生暮死的特点,所以Minor GC十分频繁,回收速度也较快,一般采用的算法为复制算法
- 调用System.gc时,系统建议执行Full GC
- 老年代空间不足时调用
- 方法区空间不足时调用
- 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
- 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
- GC担保失败
在发生Minor GC之前,JVM会检查老年代最大可用的连续空间是否大于新生代所有对象总空间。如果条件成立,那么Minor GC是安全的。
反之,如果不成立,那么要仍然要看HandlePromotionFailure值,是否允许担保失败。
如果允许担保失败,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,则冒险尝试一次Minor GC,如果小于或者不允许担保失败,则要进行一次Full GC
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。