JVM:触发Full Gc 的情况

一、System.gc()

调用这个方法会增大触发FULL GC 的概率,但不是一定会触发 GC ,这个方法的执行只是建议 JVM 执行 GC,一般不会用到该方法,只是再观察 GC 现象的时候可能会用到

二、老年代空间不足

当把对象存放入老年代的时候,如果老年代空间不足,就会触发 Major GC
四种种情况:
a)当在新生代存活时间足够长时,要进入老年代
b)当 Survivor 空间不足,存活的对象无法存入 Survivor 区,就需要老年代担保,将对象存入老年代
c)大对象直接存入老年代,例如很长的字符串以及数组
d)动态年龄判断的时候:当 Survivor 内相同年龄的对象大小总和大于整个 Survivor 内存的一半时,大 于或者等于该年龄的对象都会被存放到老年代

三、方法区空间不足

以上这些情况都会引发 Full GC

特殊说明:当 Eden 区域空间不足引发 Minor GC 的时候,要先检查老年代的最大可用连续空间是否大于新生代的所有对象总空间
(1)如果大于,那这一次 Minor GC 是安全的(安全性:指的是会不会引起 Full GC,不会则是安全的,否则是不安全的)
(2)如果小于,则要进行参数的检查,看一下参数设置是否允许担保失败,如果允许,则接着判断老年代的最大可用连续内存空间是否大于之前从新生代晋升到老年代对象的平均大小,如果大于,就会尝试进行一次 Minor GC ,但是是有风险的(可能会引发 Full GC)
(3)如果不允许担保失败或者老年代的最大可用连续内存空间小于之前从新生代晋升到老年代对象的平均大小,则将 Minor GC 改为 Full GC

注意:之所以要检查老年代的最大可用连续空间是否大于新生代的所有对象总空间,是因为存在极端情况,可能在发生 Minor GC 后所有对象都要担保进入老年代

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值