ZGC介绍

Posted junfengchan

tags:

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

zgc是一款可拓展的低时延,为实现以下几个目标而诞生的垃圾回收器:

  • 停顿时间不超过10ms
  • 停顿时间不会导致堆大小增长
  • 堆大小范围可支持几G到几T

再看一下zgc的标签:

  • region-based (和G1一样)
  • NUMA-aware
  • Concurrent
  • Compacting
  • Using load barriers(让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术,java的volatile底层使用的就是load barrier)
  • Using colored pointers()

zgc介绍-by hotspot garbage collector team:https://archive.fosdem.org/2018/schedule/event/zgc/attachments/slides/2211/export/events/attachments/zgc/slides/2211/ZGC_FOSDEM_2018.pdf

一、zgc在jdk各个版本的changelog:

JDK 13 (Released September 2019)

  • Increased max heap size from 4TB to 16TB
  • Support for uncommitting unused memory (JEP 351)
  • Support for -XX:SoftMaxHeapSIze
  • Support for the Linux/AArch64 platform
  • Reduced Time-To-Safepoint

JDK 12 (Released March 2019)

  • Support for concurrent class unloading
  • Further pause time reductions

JDK 11 (Released September 2018)

  • Initial version of ZGC
  • Does not support class unloading (using -XX:+ClassUnloading has no effect)

 

二、ZGC相关VM Options

 

General GC OptionsZGC OptionsZGC Dianostic Options (-XX:+UnlockDianosticVMOptions)

-XX:MinHeapSize, -Xms

-XX:InitialHeapSize, -Xms

-XX:MaxHeapSize, -Xmx

-XX:SoftMaxHeapSize

-XX:SoftRefLRUPolicyMSPerMB

-XX:ZAllocationSpikeTolerance

-XX:ZCollectionInterval

-XX:ZFragmentationLimit

-XX:ZMarkStackSpaceLimit

-XX:ZPath

-XX:ZUncommit

-XX:ZUncommitDelay

-XX:ZProactive

-XX:ZStatisticsForceTrace

-XX:ZStatisticsInterval

-XX:ZVerifyForwarding

-XX:ZVerifyMarking

-XX:ZVerifyObjects

-XX:ZVerifyRoots

-XX:ZVerifyViews

 

1、激活ZGC

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

2、设置堆大小,堆

-Xmx<size>

3、并发线程数,并发线程数太多会导致占用太多cpu时间分片,太少会导致回收速度跟不上垃圾生产速度。如果系统追求的是低时延,尽量不要让系统超负荷工作,cpu使用率尽量控制在70%以下

-XX:ConcGCThreads=<number>

4、return unused memery to os

这里指的是设置了xms和xmx且xmx>xms的情况,zgc默认会返回未使用的内存给操作系统,对于内存水位是重要指标的系统,返回未使用内存可以更好的观察内存使用情况。但如果要禁用这个功能,可以使用:-XX:-ZUncommit  。但无论使用哪种策略,jvm不会uncommit unsed memery导致堆大小小于xms。这也意味着如果配置xms=xmx,该特性会被隐式禁用

5、Enable Large Pages

启用方式:-XX:+UseLargePages  

Large Pages在Linux称为Huge Pages,配置zgc使用Huge Pages可以获得更好的性能(吞吐量、延迟、启动时间),并且基本没有缺点,除了配置稍微复杂一点。配置Huge Pages大小,需要注意JVM除了堆以外其他需要使用到的内存也得算进去,具体配置方法如下,就不翻译了:

技术图片

 

6、 Enable Transparent Huge Page(THP)

一般不建议在对延时敏感的系统下使用,THP一个使管理Huge Pages自动化的抽象层。

7、Enable NUMA Support

zgc默认开启NUMA支持,意味着在分配堆内存时,会尽量使用NUMA-local的内存(比跨die访问快3倍)。但当jvm发现程序使用的只是cpu的一个子集(限定使用),则会自动禁用该特性。一般不需要关注这个特性,如果需要指定,可以通过以下参数指定

 -XX:+/-UseNUMA

8、Enable GC logging

 

以上是关于ZGC介绍的主要内容,如果未能解决你的问题,请参考以下文章

JDK 11 ZGC简介

JDK 11中将会加入令人惊叹的ZGC(不到2毫秒)

JVM深层系列「官方技术翻译」《A FIRST LOOK INTO ZGC》初探JVM-ZGC垃圾回收器

JDK11 | 第七篇 : ZGC 垃圾收集器

美团对 Java 新一代垃圾回收器 ZGC 的探索与实践

JDK11 | 第七篇 : ZGC 垃圾收集器