JVM 垃圾回收器

个人总结以官网为准,如有错误欢迎指出

image.png

从思考问题开始

  • 如果你(运行的程序)在房间(内存)里不断的产生垃圾(可清除的对象),并且你青春期脾气不好,妈妈不想跟你小屁孩计较(避免打扰用户程序,减少stop the word),那妈妈会怎么做才能到达快速,并且不影响你打游戏?
    • 首先妈妈会进去看一眼,有哪些需要处理的垃圾,然后离开
    • 然后妈妈拿到工具,进入房间,把你骂出房间,快速处理再让你回来

以上妈妈的行为在垃圾回收的过程中,映射为首先标记对象,然后stop the world 清理垃圾,然后恢复程序。

垃圾回收器的分类

  • 算法分类
    • 标记复制
    • 标记清理
    • 标记整理清理
Serial回收器
  • 单线程处理
  • stop word 不可控制,直到回收完了才能恢复用户线程
  • 采用复制算法,适用新生代
Serial Old收集器
  • 单线程
  • 标记整理清理算法 在这里插入图片描述
思考问题:
  • 上面这种类型的垃圾回收器存在什么问题?
    • stop world的时间不可控制
    • 单线程吞吐量不够
    • 速度太慢
  • 那你会用什么方法解决呢?
    回到妈妈清理房间的故事中,妈妈会怎么提高垃圾清理的速度。妈妈会请一个小时工来一起清理。

所以出现了多线程并行清理的垃圾回收器。

ParNew,Parallel Scavenge,Parallel old
  • 多线程并行清理
  • 新生代标记复制,老年代标记整理
  • ParNew响应速度优先
  • Parallel Scavenge,Parallel old吞吐量优先
  • 合适后台程序
    在这里插入图片描述
思考问题
  • Parallel类型的速度解决了,清理速度和吞吐量的问题,工程师就如万恶的资本家一样总觉得还能压榨出来一点。哪里还能压榨呢?
    • 标记整理的算法,整理是很耗时的,如果我们不整理直接清除
    • 清理的时候,如果我们不stop the world,并发清理

于是出现了CMS垃圾回收器

CMS收集器
  • 初始标记,GC Roots能直接关联到的对象,速度很快,需要“Stop The World”。
  • 并发标记,做GC Tracing,时间较长,不需要Stop the world.
  • 重新标记,处理在并发标记过程中,同步执行的用户程序产生的垃圾,需要短暂的Stop the world.
  • 并发清理

在这里插入图片描述

思考问题
  • CMS 具有的优点

    • 由于并发标记,并发清理,速度快延迟低,适合实时程序与秒杀程序
  • CMS 牺牲了什么换来了低延迟

    • 它使用标记清除的算法,跳过整理,达成了低延迟。但是牺牲了长期的内存利用效率。如果前期的对象多数是小对象,后期的对象多数是大对象,那么标记清除的算法会导致后期的大对象找不到空间放置。总体上看是有足够的空间,但是找到连续合适的空间放置大对象
    • 无法处理浮动的垃圾,由于是并发清理,清理的过程中又会产生新的垃圾
  • 截至CMS垃圾回收器,我们解决了什么问题,有带来那些问题,还有那些问题没有解决。

    • 解决了:减少了stop world的时间,实现了低延迟(CMS)
    • 解决了:单线程到多线程,提高了吞吐量(Parallel 类型)
    • 未能解决的问题: stop the world的时间不可控,我们唯一能做的是等待
    • 出现的新问题: 即参考CMS的缺点
      G1 垃圾回收器解决了上面一些问题。
G1

G1 解决的问题

  • 使用标记整理算法避免浮动垃圾
  • 可以让用户控制GC的时间,间接控制了stop the world的时间

流程

  • 初始标记(Initial Marking)
    仅仅只是标记一下GC Roots 能直接关联到的对象,并且修改TAMS(Nest Top Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可以的Region中创建对象,此阶段需要停顿线程,但耗时很短。

  • 并发标记(Concurrent Marking)
    从GC Root 开始对堆中对象进行可达性分析,找到存活对象,此阶段耗时较长,但可与用户程序并发执行。

  • 最终标记(Final Marking) 为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程的Remembered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,这阶段需要停顿线程,但是可并行执行。

  • 筛选回收(Live Data Counting and Evacuation)
    首先对各个Region中的回收价值和成本进行排序,根据用户所期望的GC 停顿是时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率。

在这里插入图片描述

最后的思考:

无论是什么垃圾回收器我们都无法做的即减少stop the wold的时间,又能提高清理垃圾的数量。你不断的产生垃圾,还要求妈妈清理干净所有房间里垃圾,这本身就是不合理的。

延申到生活中,我们需要足够多的知识和经验的累积,来帮助我们权衡利弊然后做出选择,坚定执行。🐟和🐻掌不可兼得。
两利相权取其重,两害相权取其轻

引用:垃圾回收器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值