NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

具有超低停顿时间的垃圾回收算法 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:002349
用户头像

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

关注

评论

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

游戏夜读 | Scikit-learn迎来0.21之前

game1night

《零基础学 Java》 FAQ 之 7-Java 中的内存是怎么分配的

臧萌

Java JVM

Java新技术:封闭类

X.F

Java 架构 编程语言

Android | Tangram动态页面之路(二)介绍

哈利迪

android

Rust 与区块链四月月刊

Aimee 阿敏

区块链 rust 加密货币 crypto

如果你觉得学习 Git 很枯燥,那是因为你还没玩过这款游戏!

GitHubDaily

git GitHub 编程 程序员 开发者工具

尽管HTTP/3已经来了,HTTP/2也得了解啊

清远

网络协议 HTTP

Harbor 2.0的飞跃: OCI 兼容的工件仓库

亨利笔记

Kubernetes 容器 k8s Harbor 镜像

Mac 使用笔记

FeiLong

回“疫”录(18):536公里的路

小天同学

疫情 回忆录 现实纪录 纪实 返程

面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)

一枝花算不算浪漫

源码 并发编程 ThreadLocal

Xtrabackup的安装使用

一个有志气的DB

MySQL 工具 数据的分片和备份

让你高效工作与学习的免费工具(1)

石云升

高效工作 效率工具 工具

更聪明地学习,而不是苦读——《如何高效学习》

mzlogin

学习

聊聊我对技术一些性质的认识

Tanzv

技术 思考 新人

松哥手把手带你入门 Spring Security,别再问密码怎么解密了

江南一点雨

Java spring Spring Boot spring security

Redis稳定性实践

心平气和

redis 缓存 稳定性

如何在一台计算机上安装多个 JDK 版本

mghio

Java jdk 版本管理工具

对于程序员,那些既陌生又熟悉的计算机硬件

架构师修行之路

微软 编程 程序员 cpu 架构师

OpenResty部署配置和日志切割

wong

nginx centos openresty

严选合伙人(二)

Neco.W

创业 重新理解创业 合伙人

从一次排查ES线上问题得出的总结——熔断机制

罗琦

elasticsearch 源码分析 circuit break 熔断

Python 核心技术与进阶 list & tuple

Bonaparte

一文带你看清HTTP所有概念

cxuan

HTTP

谈谈控制感(5):怎么破控制感损失的局

史方远

职场 心理 成长

《后浪》产品经理篇(恶搞版)

静陌

产品经理 后浪

设计模式之观察者模式

设计模式

松哥手把手教你定制 Spring Security 中的表单登录

江南一点雨

Java spring Spring Boot spring security

业余前端的日常

顿晓

学习 大前端 日常 专家 知识体系

MySQL常用权限说明

一个有志气的DB

MySQL 用户研究

sync.Map源码分析

陈思敏捷

源码 源码分析 Go 语言

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