天天看点

JDK GC 方面的进展

GC 方面的进展

JDK 中主要的 GC 分类有:

Serial,单线程进行 GC,在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。

Parallel,相比 Serial 收集器,Parallel 最主要的优势在于使用多线程去完成垃圾清理工作,这样可以充分利用多核的特性,大幅降低 GC 时间。

CMS(Concurrent Mark-Sweep),是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。实现 GC 线程和应用线程并发工作,不需要暂停所有应用线程。

G1(Garbage First Garbage Collector),G 设计初衷是为了尽量缩短处理超大堆(大于 4GB)时产生的停顿。相对于 CMS 的优势而言是内存碎片的产生率大大降低。

目前在 JDK8 中以上 4 种 GC 都可以使用,而在 JDK9 中 G1 GC 会成为默认的垃圾收集器。

在 OpenJDK 方面,Redhat 开源并贡献了 Shenandoah GC。这是一种新的 Java 虚拟机 GC 算法,目标是利用现代多核 CPU 的优势,减少大堆内存在 GC 处理时产生的停顿时间。在使用大内存的应用上使用,如>20G 堆空间。Fedora24 以后,官方源中的 OpenJDK 即带有 Shenandoah 算法,不过 JDK9 中还不会被加入。

无停顿的高性能 GC 就是 Azul 公司的 C4(Continuously Concurrent Compacting Collector) GC 了,但只提供商业版本使用。

另外 IBM J9 中 Balanced GC,表现也很出色,能够保证相对一致的暂停时间而避免破坏性的长时间停顿。Balanced GC 应用在各类 IBM 中间件产品之中。