The Z Garbage Collector (ZGC) 【1】

瘦欲@ 提交于 2019-12-03 20:29:11

简介

Java 11 中带了一个新的GC回收器:Z Garbage Collector (ZGC)

  • 可伸缩
  • 低延迟
  • 并发执行

适用于:

  • 对延迟有要求
    • 10ms 级别
  • 巨大的堆空间
    • TB 单位

Java 11 才引入,目前还是实验性质

启用

可以通过:-XX:+UseZGC启用ZGC; 还需要带上:-XX:+UnlockExperimentalVMOptions(解锁隐藏vm选项)

堆空间大小设定

ZGC中最重要的参数,就是堆的最大空间:-Xmx

因为ZGC是并发执行,所以最大堆空间必须设定:

  1. 堆中存放着应用中活动数据
  2. 如果堆中有足够的可用空间,那么在GC期间,分配器就可以继续工作
    • 也只有这样才是并发GC
    • 这就需要对分配器速率与活动数据集的大小进行预估,通常:
      1. 更大的内存空间,ZGC越能更好的工作
      2. 但与此同时,内存可能就会浪费
      • 需要在这两个方面寻找一个平衡点

并发GC的线程数

对于ZGC并发执行GC的线程数量,可以通过:-XX:ConcGCThreads设定。

ZGC默认会自动测算出一个合理的线程数量:

  • 通常情况,这个测算出来的数值是比较合理的
  • 这个参数,实际是决定了分配多少CPU时间(资源)用于GC
    • 如果太多,则GC会占用过多CPU资源,从而影响应用的正常运行
    • 如果太少,则会让GC吞吐下降,也会影响应用的内存分配

GC选用策略

如果不是对暂停时间有特殊要求,那么请尽量让VM自己来选择GC策略。

如果需要,还可以通过调整堆区大小,来改进性能。如果还不能达到性能要求,可以从以下几个方面来选择GC策略:

  • 如果应用所需的内存很小(如:100MB左右)
    • 那直接选用串行GC即可:-XX:+UseSerialGC
  • 如果应用运行在单核处理器环境;或者对暂停时间没什么要求的场景
    • 那应当优先选用串行GC:-XX:+UseSerialGC
  • 如果很在乎应用的峰值性能,并且对暂停时间无要求(或者可以接受一个较长的暂停时间)
    • 则可选用并行GC策略:-XX:+UseParallelGC
  • 如果更看重响应时间,而不是整体吞吐率
    • 并且期望GC暂停时间想要控制在秒级
      • 那么可以选用mostly concurrent收集策略
        • -XX:+UseG1GC
        • -XX:+UseConcMarkSweepGC
  • 如果对响应时间有极高要求,或者使用的堆非常大(TB级),那么可以尝试:-XX:UseZGC(完全并发回收)

以上策略仅仅是选用GC的一般思路。GC性能主要取决于:

  • 堆大小
  • 应用数据的实时存活情况
  • 处理器的数量和性能

如果经过这些分析,没有获得预期中的性能表现。请首先尝试调整堆区大小、分代空间大小;如果性能仍然不理想,再尝试不同的GC策略:

  • 使用并发GC,以减少暂停时间
  • 使用并行GC,在多核环境下改善整体吞吐量
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!