java什么时候进行垃圾回收,垃圾回收的执行流程

java的垃圾回收分为

三个区域:新生代 老年代 永久代,如下图



一个对象实例化时会看看新生代里的Eden(伊甸园)里面有没有足够的空间

如果有,就不进行垃圾回收,对象直接储存在Eden(伊甸园)里

如果没有就会进行一次minor gc(从新生代空间(包括 Eden 和 Survivor 区域)回收内存)

然后再判断Eden(伊甸园)的内存是否足够

如果不足,就看 Survivor (存活区)的内存是否足够

如果内存足够,把Eden(伊甸园)部分活跃对象保存在存活区,然后再把对象保存在Eden(伊甸园)

如果内存不足够,就像老年代发送请求,查看老年代的内存是否足够

如果足够就将部分存活区的活跃对象存在Tenured(老年代),然后再把Eden(伊甸园)部分活跃对象保存在存活区,最后再把对象保存在Eden(伊甸园)

如果内存不够,就会进行一次full gc(是清理整个堆空间—包括年轻代和老年代),然后再次对Tenured(老年代)内存进行判断,

如果足够就进行上面的步骤,如果还不足就会抛出OutOfMemoryError



GC虽然可以进行内存空间的释放,但同时频繁的GC一定会影响性能,GC发生的频率越低,你的系统就越高效.


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值