简介
官方wiki地址https://wiki.openjdk.java.net/display/zgc
ZGC是JDK11开始出现(Linux版是jdk11,Windows版是jdk14),它是可伸缩低延时的新GC设计方案,它的目标:
- GC最大暂停时间毫秒级。
- GC暂停时间不会随着堆或活动集大小的增加而增加。
- 可处理堆的大小从8MB到16 TB之间。
启用ZGC
基本用法:
-XX:+UseZGC -Xmx<size> -Xlog:gc
想要显示更多的日志:
-XX:+UseZGC -Xmx<size> -Xlog:gc*
在JDK15之前的版本中,使用ZGC还必须添加参数 -XX:+UnlockExperimentalVMOptions 在-XX:+UseZGC之前。JDK15中,ZGC已经是准生产的功能,就不用加这个参数。
ZGC可用的JVM参数列表:
General GC Options
|
ZGC Options
|
ZGC Diagnostic Options (-XX:+UnlockDiagnosticVMOptions)
|
---|---|---|
-XX:MinHeapSize, -Xms
-XX:InitialHeapSize, -Xms -XX:MaxHeapSize, -Xmx -XX:SoftMaxHeapSize -XX:ConcGCThreads -XX:ParallelGCThreads -XX:UseLargePages -XX:UseTransparentHugePages -XX:UseNUMA -XX:SoftRefLRUPolicyMSPerMB
-XX:AllocateHeapAt |
-XX:ZAllocationSpikeTolerance
|
-XX:ZStatisticsInterval
|
配置ZGC
设置堆大小
ZGC最重要的优化选项是设置最大堆大小(-XMX<size>)。由于ZGC是一个并发收集器,所以必须选择最大堆大小,以便:1)堆可以容纳应用程序的活动集;2)堆中有足够的空间允许在GC运行时为分配服务。
需要多少空间取决于应用程序的分配率和活动设置大小。一般来说,给ZGC的内存越多越好。但是,同时,浪费内存是不可取的,所以这都是为了在内存使用和GC需要运行的频率之间找到一个平衡。
设置并发GC线程数
第二个调优选项是设置并发GC线程的数量(-XX:ConcGCThread=<number>)。ZGC有自动选择这个数字的启发式方法。这种启发式通常很好,但根据应用程序的特点,可能需要调整。
这个选项本质上决定了GC应该给予多少CPU时间。给它太多,GC将占用太多的CPU时间。使用它太少,应用程序分配垃圾的速度可能比GC收集垃圾的速度要快。
通常,如果低延迟(即低应用程序响应时间)对您的应用程序很重要,那么永远不要过多地提供您的系统资源。理想情况下,系统的CPU利用率不应超过70%。
返回未使用的内存到操作系统
默认情况下,ZGC取消提交未使用的内存,并将其返回到操作系统。这对于内存占用问题的应用程序和环境非常有用。可以使用-XX:-ZUnCOMMIT禁用此功能。此外,内存不会被取消提交,这样堆大小就会缩小到最小堆大小(-XMS)以下。这意味着,如果最小堆大小(-XMS)配置为等于最大堆大小(-XMX),则此特性将被隐式禁用。
可以使用-XX:ZUnconnectionDelay=<sec>(默认为300秒)配置取消提交延迟。此延迟指定在符合取消提交条件之前,应该使用多久的内存。
注意:在Linux上,不提交未使用的内存需要FALLOC_FL_CHINK_HOME支持的FALLOC(2),这首先出现在内核版本3.5(对于tmpfs)和4.3(对于hugetlbfs)中。
在Linux上启用大内存页
具体参看官方文档
开启GC日志
开启GC日志的命令行参数:
-Xlog:<tag set>,[<tag set>, …]:<log file>
开启基本的日志:
-Xlog:gc:gc.log
开启可供性能分析的日志:
-Xlog:gc*:gc.log
查看日志的帮助手册:
-Xlog:help