简介
Java 11 中带了一个新的GC回收器:Z Garbage Collector (ZGC)。
- 可伸缩
- 低延迟
- 并发执行
适用于:
- 对延迟有要求
- 10ms 级别
- 巨大的堆空间
- TB 单位
Java 11 才引入,目前还是实验性质
启用
可以通过:-XX:+UseZGC
启用ZGC;
还需要带上:-XX:+UnlockExperimentalVMOptions
(解锁隐藏vm选项)
堆空间大小设定
ZGC中最重要的参数,就是堆的最大空间:-Xmx
。
因为ZGC是并发执行,所以最大堆空间必须设定:
- 堆中存放着应用中活动数据
- 如果堆中有足够的可用空间,那么在GC期间,分配器就可以继续工作
- 也只有这样才是并发GC
- 这就需要对分配器速率与活动数据集的大小进行预估,通常:
- 更大的内存空间,ZGC越能更好的工作
- 但与此同时,内存可能就会浪费
- 需要在这两个方面寻找一个平衡点
并发GC的线程数
对于ZGC并发执行GC的线程数量,可以通过:-XX:ConcGCThreads
设定。
ZGC默认会自动测算出一个合理的线程数量:
- 通常情况,这个测算出来的数值是比较合理的
- 这个参数,实际是决定了分配多少CPU时间(资源)用于GC
- 如果太多,则GC会占用过多CPU资源,从而影响应用的正常运行
- 如果太少,则会让GC吞吐下降,也会影响应用的内存分配
GC选用策略
如果不是对暂停时间有特殊要求,那么请尽量让VM自己来选择GC策略。
如果需要,还可以通过调整堆区大小,来改进性能。如果还不能达到性能要求,可以从以下几个方面来选择GC策略:
- 如果应用所需的内存很小(如:100MB左右)
- 那直接选用串行GC即可:
-XX:+UseSerialGC
- 那直接选用串行GC即可:
- 如果应用运行在单核处理器环境;或者对暂停时间没什么要求的场景
- 那应当优先选用串行GC:
-XX:+UseSerialGC
- 那应当优先选用串行GC:
- 如果很在乎应用的峰值性能,并且对暂停时间无要求(或者可以接受一个较长的暂停时间)
- 则可选用并行GC策略:
-XX:+UseParallelGC
- 则可选用并行GC策略:
- 如果更看重响应时间,而不是整体吞吐率
- 并且期望GC暂停时间想要控制在秒级
- 那么可以选用mostly concurrent收集策略
-XX:+UseG1GC
-XX:+UseConcMarkSweepGC
- 那么可以选用mostly concurrent收集策略
- 并且期望GC暂停时间想要控制在秒级
- 如果对响应时间有极高要求,或者使用的堆非常大(TB级),那么可以尝试:
-XX:UseZGC
(完全并发回收)
以上策略仅仅是选用GC的一般思路。GC性能主要取决于:
- 堆大小
- 应用数据的实时存活情况
- 处理器的数量和性能
如果经过这些分析,没有获得预期中的性能表现。请首先尝试调整堆区大小、分代空间大小;如果性能仍然不理想,再尝试不同的GC策略:
- 使用并发GC,以减少暂停时间
- 使用并行GC,在多核环境下改善整体吞吐量
来源:oschina
链接:https://my.oschina.net/u/2834723/blog/2251369