JVM中GC的流程

Java程序中新创建的对象在JVM中的堆内存中分配空间,堆内存是线程共享的,分为两个区域年轻代和老年代,年轻代一般存放一些用完就释放的对象,老年代一般存放常驻内存的对象。

  • GC的主要流程
    在这里插入图片描述
  • Minor GC的流程
    Minor GC过程中所有工作线程都会暂停,如果使用的是ParNew垃圾回收器,就会根据CPU的核数开启相应数量的垃圾回收线程
    在这里插入图片描述
  • Full GC流程
    一般使用CMS(Concurrent Mark Sweep)垃圾回收器进行Full GC 分为四个阶段
    1. 初始标记
      暂停所有工作线程,只启用垃圾回收线程,标记老年代中被GC Roots直接引用的对象为存活对象,否则为垃圾对象
    2. 并发标记
      垃圾回收线程和工作线程并发执行,追踪所有GC Roots直接引用或间接引用的对象,并进行标记,此时会有新对象进入老年代,也会有存活对象变为垃圾对象,但在这个阶段我们不去理
    3. 重新标记
      继续暂停工作线程,重新标记那些新进入老年代的对象和并发标记阶段状态改变的对象
    4. 并发清理
      垃圾回收线程和工作线程并发执行,清理所有垃圾对象,但是这个阶段还是并发执行的,也会有一些新对象进入老年代,但我们不去理等到下一次GC再去清理。

需要注意的有两点

  1. 由于Full GC和工作线程是并发执行的,在GC过程中会有新对象进入老年代,所以系统必须预留出一部分内存默认是百分之92,如果超过这个阈值就会触发Full GC,保证Full GC过程中不会导致OOM,如果GC过程中老年代已满,就会更换为Serial Old垃圾回收器进行单线程GC,期间所有工作线程都会暂停
  2. 由于CMS使用的是标记-清理算法,每次GC过后都会导致老年代产生大量内存碎片,所以在每次或几次Full GC后都会暂停工作线程进行内存整理,将存活对象紧凑整理在一起,从而空出一片连续内存空间继续使用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值