ZGC深入学习

ZGC简介

本次调研目标选取的是jdk11(long-term support)下首次亮相的zgc。

zgc介绍简单翻译了zgc main page:ZGC简介

另外参考hotspot garbage collector team介绍zgc用的ppt:https://archive.fosdem.org/2018/schedule/event/zgc/attachments/slides/2211/export/events/attachments/zgc/slides/2211/ZGC_FOSDEM_2018.pdf

 

ZGC关键字

  • region base:区别于G1,zgc支持动态决定region大小,region size schema:small(2m)、medium(32m)、large(2*n m)
  • load barrier and color pointer:是zgc在回收的大部分步骤都能并发的原因 (跟其他垃圾回收器的store barrier有点区别,待深入)
  • 10ms:STW只遍历GC root,因此不会随着heap变大而变慢,这也是为什么STW能维持在10ms以内的原因
  • 64位指针:使用64位指针未使用的bit位来记录元数据,因此不支持指针压缩,不支持32位平台。目前,42位用于存储对象地址,4位存gc过程元数据,18位未开发


ZGC gc策略及回收过程相关参数(详细见:ZGC gc策略及回收过程-源码分析):

-XX:ZCollectionInterval

固定时间间隔进行gc,默认值为0。

-XX:ZAllocationSpikeTolerance

内存分配速率预估的一个修正因子,默认值为2。一般不需要更改

-XX:ZProactive

是否启用主动回收策略,默认值为true。一般建议开启

 

其他参数分析

本文仅对ZGC相关的参数进行分析,jdk相关参数不在本次研究范围

1、激活ZGC: -XX:UseZGC

2、配置并发线程数:-XX:ConcGCThreads=<number>

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

3、返还未使用的内存给OS:-XX:ZUncommit

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

4、启用Large Pages:-XX:+UseLargePages -XX:ZPath 

Large Pages在Linux称为Huge Pages,配置zgc使用Huge Pages可以获得更好的性能(吞吐量、延迟、启动时间),并且基本没有缺点,除了配置稍微复杂一点。配置Huge Pages大小,需要注意JVM除了堆以外其他需要使用到的内存也得算进去,一般配合ZPath使用。配置方法可以见:ZGC简介里的Enbling Large Page

5、启用NUMA Support:-XX:UseNUMA

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

6、启用Transparent Huge Page(THP)

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

7、Relocate时,会根据当前region是否碎片化已大于ZFragmentationLimit,是则回收region,relocate至current candidate relocation set。

-XX:ZFragmentationLimit,默认值25

8、设置打印ZStat统计数据(cpu、内存等log)的间隔  -XX:ZStatisticsInterval

 

ZGC的不足

目前zgc还是被标记为实验性质的,说明还不够成熟,vm参数范围不断在调整。实验性质就是说ZGC在一些大内存的场景中表现了良好的性能,同时也说明ZGC还有一些不足,主要有:

  • ZGC仅实现了单代内存管理,也就是说没有考虑热点数据与冷数据,这个在商业的C4已经支持。据说Auzl实现的分代内存管理器比没有分代的内存管理器效率高10倍(并没有找到相关的资料文献),也就是说ZGC还有巨大的进步空间;
  • C2的支持还不够完善;
  • 不支持Graal, HDSB等功能。 

 

Deprecated

1.Deprecated in jdk12

-XX:ZConcurrentStringTable

-XX:ZConcurrentVMWeakHandles

-XX:ZMarkStacksMax

-XX:ZWeakRoots

-XX:ZOptimizeLoadBarriers

-XX:ZStallOnOutOfMemory

-XX:ZSymbolTableUnloading

2.Deprecated in jdk13

-XX:ZUnmapBadViews

 

其他

-XX:ZMarkStackSpaceLimit(jdk12才有的参数):Maximum number of bytes allocated for mark stacks

-XX:ZUncommit(jdk13才有的参数):Uncommit unused memory

-XX:ZUncommitDelay (jdk13才有的参数):Uncommit memory if it has been unused for the specified amount of time (in seconds)

 

资料与工具

jdk jvm参数查询工具:https://chriswhocodes.com

jdk jvm参数查询官网:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

jdk11 源码:https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_src.zip

ZGC与G1一样都是region-base的垃圾回收器,G1 Paper: https://www.researchgate.net/publication/221032945_Garbage-First_garbage_collection

ZGC的实现参考了C4算法,Azul C4 Paper:https://www.azul.com/files/c4_paper_acm1.pdf

ZGC其他相关资料:https://archive.fosdem.org/2018/schedule/event/zgc/attachments/slides/2211/export/events/attachments/zgc/slides/2211/ZGC_FOSDEM_2018.pdf

ZGC相关的书:《ZGC的设计与实现》

ZGC简介:https://wiki.openjdk.java.net/display/zgc/Main

R大博客:https://www.iteye.com/blog/rednaxelafx-362738 

jvm调优参考了江南白衣的博客:http://calvin1978.blogcn.com/articles/jvmoption-7.html

其他参考资料:

什么是NUMA架构:http://cenalulu.github.io/linux/numa/

huge pages:https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html

linux memery commit: http://linuxperf.com/?p=102

Memery Barrier:https://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.html

什么是JEP、JSR、JLS:https://stackoverflow.com/questions/51282326/what-is-the-difference-or-relation-between-jls-jsr-and-jep

posted on 2019-10-20 16:57  西楼有酒  阅读(1824)  评论(0编辑  收藏  举报

导航