写点什么

具有超低停顿时间的垃圾回收算法 Shenandoah

  • 2017-01-10
  • 本文字数:1123 字

    阅读完需:约 4 分钟

早在三年前,Red Hat 就启动了 Shenandoah 项目。Shenandoah 是一种新的 Java 虚拟机 GC 算法,目标是利用现代多核 CPU 的优势,减少大堆内存在 GC 方面存在的停顿时间。Shenandoah 后来被贡献给了 OpenJDK,正式成为 OpenJDK 的开源项目,也就是 JEP 189

总的来说,大部分垃圾回收器要么使用古老的标记并清除算法,要么使用分代算法,再结合并发和堆压缩。垃圾回收器多种多样,但没有一种回收器能够满足所有的需求,它们总要在某些方面做出折衷,并且不可避免地存在停顿时间。而 Shenandoah 最大的两个特点是它伸缩性和超低停顿时间。

Shenandoah 最初的目标是把 GC 停顿时间降到 10 毫秒以下,并且对内存的支持扩展到 TB 级别。为了降低停顿时间,回收器需要使用更多的线程来并行处理回收任务。而要在降低停顿时间的同时能够支持更大的堆空间,回收器对 CPU 的多核处理能力提出了更高的要求。相比于 CMS G1 ,Shenandoah 不仅进行并行的垃圾标记,在压缩堆空间时也是并行进行的。

Shenandoah 把堆空间分为很多区域,例如整个堆空间是 1G,如果每个区域是 1M,那么就会有 1000 多个区域。传统的标记并清除回收器并没有区域的概念,而拷贝回收器一般也只有两个或少数几个区域。通过更细粒度的分区,Shenandoah 可以优先对包含更多垃圾的区域进行回收,同时有助于并行回收工作的进行。

Shenandoah 是一个标记拷贝回收器,它的回收工作分为两个阶段。第一个阶段是标记阶段。在这个阶段,回收器会对每个区域里的对象进行标记,并计算它们的数量。第二个阶段,回收器对源区域的对象进行扫描,并把存活对象拷贝到目标区域,然后源区域的内存就可以被释放。这两个阶段看似很简单,但要让整个过程并行进行,从而降低停顿时间,事情就会变得复杂很多。

到目前为止,Shenandoah 已经实现了很多特性,包括运行时、解释器、C1 屏障和 C2 屏障、对弱引用的支持、对 JNI 临界区域的支持、对 System.gc() 的支持,等等。Shenandoah 目前还算稳定,它的平均性能能够达到 G1 的 90%,有时候会差一些,比如 70%,不过有时候会超过 G1,比如 150%。不过 Shenandoah 的停顿时间比 G1 要短很多,不过相比之前定下的目标,还有很大距离。

目前还没有把 Shenandoah 用在 Java 9 里的计划,不过如果有人对此感兴趣,可以自己从源代码构建特别版本的JDK 来体验Shenandoah。关于更多Shenandoah 的细节可以在这里看到。

不过,从Shenandoah 的目标来看,它更适合用在大堆上。所以,如果CPU 资源有限,内存也不大,比如小于20G,那么就没有必要使用Shenandoah。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-01-10 18:002380
用户头像

发布了 322 篇内容, 共 135.9 次阅读, 收获喜欢 144 次。

关注

评论

发布
暂无评论
发现更多内容

用户体验至上时代,银行的“主动出击”

博睿数据

金融 博睿数据 数据链DNA IT运维

Java 实现 捕鱼达人 小游戏【附源码】

JavaPub

【等保测评】等保测评师怎么考,前景怎么样?

行云管家

网络安全 IT运维 等保测评 等保测评师

git bisect:让你闭眼都能定位疑难 bug的利器

华为云开发者联盟

开发 bug git bisect 二分法定位

Java 实现 植物大战僵尸 小游戏【附源码】

JavaPub

Java

俄罗斯方块【附源码】

JavaPub

吃豆人游戏【附源码】

JavaPub

固态硬盘和机械硬盘的区别(7大区别,简单易懂)

源字节1号

软件开发 前端开发 后端开发 小程序开发

基于阿里云 ASK 的 Istio 微服务应用部署初探

阿里巴巴云原生

阿里云 容器 微服务 云原生 服务网格

大数据培训数仓实践 Kimball 维度建模

@零度

数仓 大数据开发

小鸟飞行游戏【附源码】

JavaPub

常用的 Lambda 表达式案例解析,工作中都会用到!

CRMEB

中科大脑知识图谱平台建设及业务实践

NebulaGraph

图数据库 知识图谱

亚信安慧AntDB数据库斩获“最佳数据库品牌”大奖

亚信AntDB数据库

超级马里奥【附源码】

JavaPub

Java 实现 1024 小游戏【附源码】

JavaPub

如何快速解决集群异常和机器性能波动

NebulaGraph

可视化 图数据库 知识图谱

【技术干货】代码示例:使用 Apache Spark 连接 TDengine

TDengine

数据库 tdengine 开源 时序数据库

编程,不止有代码,还有艺术

华为云开发者联盟

数据库 倒排索引 GaussDB(for Influx) hint

Java 实现 贪吃蛇 小游戏【附源码】

JavaPub

关于敏捷测试象限的“秘密”

BY林子

敏捷开发 敏捷测试 测试策略

深入解析 TiFlash丨多并发下线程创建、释放的阻塞问题

PingCAP

Java实现一个打飞机的小游戏【附源码】

JavaPub

Java实现一个坦克大战的小游戏【附源码】

JavaPub

A New ETL Language -- Easy SQL

Bright

数据开发 ETL 大数据开发 EasySQL

给小白的 PG 容器化部署教程(上)

RadonDB

postgresql 容器化 数据库·

高危!Fastjson反序列化漏洞风险

源字节1号

软件开发

上新了 亚麻云 | 远程办公有点上头?解锁云上应用现代化的奥秘

亚马逊云科技 (Amazon Web Services)

远程办公 应用

【等保测评】2022年北京正规等保测评机构新名单公布

行云管家

等保测评 北京

3D赛车【附源码】设计实现

JavaPub

艾莫尔研究院基于Karmada的落地实践

华为云开发者联盟

云原生 Karmada 自动化集群管理

具有超低停顿时间的垃圾回收算法Shenandoah_语言 & 开发_薛命灯_InfoQ精选文章