前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >垃圾回收器

垃圾回收器

原创
作者头像
Mr.Shelby
发布2024-12-30 19:51:22
发布2024-12-30 19:51:22
581
举报

垃圾回收器

1.Parallerl Scavenge

追求可控吞吐量,标记复制实现多线程

2.CMS

追求最短停顿时间

  • 初始标记
  • STW (Stop The Wrold全部暂停)
  • 并发标记
  • 遍历GcRoot对象图
  • 重新标记
  • STW,修正并发标记时的变动
  • 并发清除

默认回收线程数=(core+3)/4,核心不够则压力很大。由于收集是并行所以要留空间给用户线程,若不够则会再触发gc。基于标记-清除,存在碎片空间

增量更新

3.Garbage First(G1)

面向服务端,首创局部收集,基于Region布局

将堆分为大小相同的Region,自行决定那块是eden,survivor,old。超过Region一半称Humongous

维护价值表,优先处理回收价值大的Region(所获空间/时间)

跨Region引用-各Region维护自己的记忆集,一个哈希表,key是别的Region地址,value是集合。是一个双向表,内存负担大,10%-20%的额外内存

运作过程

  • 初始标记
  • 标记GcRoots对象,暂停耗时很短-STW
  • 并发标记
  • 扫描整个GcRroots对象图,STAB记录此时变动的对象——(STAB是原始快照)
  • 最终标记
  • 暂停处理SATB记录-STW
  • 筛选回收
  • 更新,统计,排序Region,根据用户指定的期望time制定回收计划。将存活复制到空的Region中,清空旧REgion——STW

4.Shenandoah

内存布局和G1相同,使用Region

不区分年代

放弃记忆集改用连接矩阵直接记录全集跨Region引用,类似二维表格

运行过程

  • 初始标记
  • 和G1差不多-STW
  • 并发标记
  • 同G1遍历对象图
  • 最终标记
  • 处理剩下的STAB,统计Region价值,组成Collection Set-STW
  • 并发清理
  • 将Region中一个存活对象都没有的Region清除
  • 并发回收
  • 将存活对象复制入空的Region,时间取决于回收集大小
  • 初始引用更新
  • do noting,提供一个线程集合点,确保移动对象任务完成-短暂STW
  • 并发引用更新
  • 不需要按对象图搜索,按内存物理地址顺序线性搜索出引用类型,把旧值更改
  • 最终引用更新
  • 修正GcRoots引用-STW
  • 并发清理
  • 回收所有回收集的Region内存空间

Brooks Point-转发指针

  • 处理在并发引用更新时对旧对象的访问问题,在每个对象头前面加一个指针
  • 当对象有一个新副本时,只需要修改指针,只要旧对象内存还在,旧能访问到新内存区域,保持代码仍然可用
  • 在读,写屏障都加入了额外处理——处理多线程并发对旧对象的操作,特别是读屏障,非常消耗资源

5.ZGC

吞吐量=运行代码的时间/(运行代码的时间+垃圾回收的时间)

三大指标:内存占用 吞吐量,延迟-Most

内存保护陷阱:用户访问属于旧对象的内存空间时进入预设好的异常处理器,再通过其中的代码逻辑转到复制后的新对象上。会在用户态——核心态转换

在最新长支持的jdk版本17、21中,默认的垃圾回收器都是G1,在jdk14之前,zgc只能运行在linux上

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 垃圾回收器
    • 1.Parallerl Scavenge
    • 2.CMS
      • 追求最短停顿时间
      • 默认回收线程数=(core+3)/4,核心不够则压力很大。由于收集是并行所以要留空间给用户线程,若不够则会再触发gc。基于标记-清除,存在碎片空间
      • 增量更新
    • 3.Garbage First(G1)
      • 面向服务端,首创局部收集,基于Region布局
      • 将堆分为大小相同的Region,自行决定那块是eden,survivor,old。超过Region一半称Humongous
      • 维护价值表,优先处理回收价值大的Region(所获空间/时间)
      • 跨Region引用-各Region维护自己的记忆集,一个哈希表,key是别的Region地址,value是集合。是一个双向表,内存负担大,10%-20%的额外内存
      • 运作过程
    • 4.Shenandoah
      • 内存布局和G1相同,使用Region
      • 不区分年代
      • 放弃记忆集改用连接矩阵直接记录全集跨Region引用,类似二维表格
      • 运行过程
      • Brooks Point-转发指针
    • 5.ZGC
      • 吞吐量=运行代码的时间/(运行代码的时间+垃圾回收的时间)
      • 三大指标:内存占用 吞吐量,延迟-Most
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档