JVM:垃圾回收过程

(1)创建一个新对象,判断该对象是否大于或者等于大对象的阈值(JVM用-XX:PretenureSizeThreshold来定义),如果判断为大对象,则直接进入堆上的老年代区域,此时如果老年代没有足够可用空间大小分配该对象所需的内存,则触发 Full GC

(2)如果判断为小对象,则优先在堆上的新生代 Eden 区域分配内存,如果内存足够存放,则对象创建结束,不存在垃圾回收过程

(3)如果Eden没有足够的内存空间分配,则JVM会进行一次 Minor GC (新生代垃圾回收)
在进行 Minor GC 之前,需要检查老年代的可用连续内存空间是否大于新生代的所有对象总空间
a)如果大于,那这一次 Minor GC 是安全的(安全性:指的是会不会引起 Full GC,不会则是安全的,否则是不安全的
b)如果小于,则要进行参数的检查,看一下参数设置是否允许担保失败,如果允许,则接着判断老年代的最大可用连续内存空间是否大于之前从新生代晋升到老年代对象的平均大小,如果大于,就会尝试进行一次 Minor GC ,但是是有风险的(可能会引发 Full GC)
c)如果不允许担保失败或者老年代的最大可用连续内存空间小于之前从新生代晋升到老年代对象的平均大小,则将 Minor GC 改为 Full GC

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

(4)如果安全的进行 Minor GC 则将采用复制算法,将 Eden 区和其中一块 Survivor 区中的存活对象复制到另一块 Survivor 区,然后将之前的两块区域中的对象全部清除

(5)当 Survivor 区内年龄相同的对象大小大于 Survivor 区总大小的一半时,这些大于或者等于该年龄的对象都会进入老年代,如果对象的垃圾回收年龄大于等于 15 也会进入老年代,这些情况的对象进入老年代时,如果老年代可用内存空间不足,则会引发 Full GC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值