JDK 11 的垃圾回收

Posted IT技术知识库

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK 11 的垃圾回收相关的知识,希望对你有一定的参考价值。

由于我们目前的项目大多还在JDK5、JDK6下运转,突然看到JDK11下面一堆可以选择的GC,简直是相见恨晚。

先对于现在我们可以使用的 parallel Collector,JDK 11 提供了

Serial Collector、Parallel Collector、Concurrent Mark Sweep (CMS) collector 、Garbage-First (G1) garbage collector 、 Z Garbage Collector 等。


Parallel Collector

并行收集器(此处也称为吞吐量收集器)是类似于串行收集器的分代收集器。串行和并行收集器之间的主要区别在于并行收集器具有多个线程,用于加速垃圾收集。

使用命令行选项-XX:+ UseParallelGC启用并行收集器。默认情况下,使用此选项,可以并行运行次要集合和主要集合,以进一步减少垃圾收集开销。


 Concurrent Mark Sweep (CMS) collector

并发标记扫描(CMS)收集器专为需要较短垃圾收集暂停且能够在应用程序运行时与垃圾收集器共享处理器资源的应用程序而设计通常,具有相对大的长寿命数据集(Old Generation)并且在具有两个或更多处理器的机器上运行的应用程序倾向于受益于该收集器的使用。

使用命令行选项-XX:+UseConcMarkSweepGC启用CMS收集器。

不推荐使用CMS收集器。强烈考虑使用Garbage-First收集器代替CMS。


Garbage-First (G1) garbage collector

Garbage-First(G1)垃圾收集器的目标是具有大量内存的多处理器计算机。它试图以高概率满足垃圾收集暂停时间目标,同时在几乎不需要配置的情况下实现高吞吐量。 G1旨在使用当前目标应用程序和环境提供延迟和吞吐量之间的最佳平衡,其功能包括:
    
堆大小最多为10 GB或更大,超过50%的Java堆占用实时数据。
    
对象分配和促销的比率可能会随着时间的推移而显着变化。
    
堆中存在大量碎片。
    
可预测的暂停时间目标目标,不超过几百毫秒,避免长时间的垃圾收集暂停。

在JDK 11 中 G1是默认的收集器。

 Z Garbage Collector (ZGC) 

Z垃圾收集器(ZGC)是一个可扩展的低延迟垃圾收集器。 ZGC同时执行所有昂贵的工作,而不会停止执行应用程序线程超过10毫秒,这使得它适用于需要低延迟和/或使用非常大的堆(多兆兆字节)的应用程序。

Z垃圾收集器作为实验性功能提供,并使用命令行选项

"-XX:+ UnlockExperimentalVMOptions -XX:+UseZGC" 启用。


我们可以根据应用程序的需求来选择使用不同的GC,官方建议如下:


如果没有特别的需求比如有相当严格的暂停时间要求,建议应用程序中允许VM自己选择收集器。如果有可能,尽量增加heap size的大小,以便提高程序的运行性能。

如果上述两点无法满足需求,可以参照下面的规则调整GC

如果应用程序的二进制文件较小( < 100 MB),建议使用 Serial Collector ,使用方法就是在java运行程序命令行添加参数“ -XX:+UseSerialGC”。

如果程序在单个处理器上没有暂停的时间长度要求,建议使用 Serial Collector,使用方法同上。

如果峰值应用程序性能是排在最优先位置,并且对程序没有暂停时间要求或暂停一秒或更长时间是可接受的,那么建议应用程序中允许VM自己选择收集器或者使用 Parallel Collector 进行垃圾回收,使用方法就是在java运行程序命令行添加参数“ -XX:+UseParallelGC”。

如果响应时间比总吞吐量更重要,并且垃圾收集暂停必须保持短于大约一秒,那么选择使用部分并发的垃圾收集器,如G1或者 CMS 进行垃圾回收,使用方法就是在java运行程序命令行添加参数“ -XX:+UseG1GC或 “-XX:+UseConcMarkSweepGC

 如果响应时间是高优先级,而我们又有非常大Heap,那么我们就可以选择使用完全并发的GC: Z Garbage Collector,使用方法就是在java运行程序命令行添加参数“ -XX:+UseZGC” 。

如果推荐的收集器未达到所需性能,则首先尝试调整堆和生成大小以满足所需目标。如果性能仍然不足,那么尝试使用不同的收集器:使用合并收集形式的GC来减少暂停时间,并使用并行收集器来提高多处理器硬件的总吞吐量。





以上是关于JDK 11 的垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

从 JDK 8 到 JDK 18,Java 垃圾回收的十次进化

JVM系列之经典垃圾回收器(上篇)

JVM 架构解释 + 垃圾回收机制 详解(基于JDK8版本)

JVM 垃圾回收笔记

Java学习笔记3.11.2 垃圾回收 - 垃圾回收的实现方式

从 JDK 8 到 JDK 18,Java 垃圾回收的十次进化