The Z Garbage Collector (ZGC) 【1】

简介

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

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

适用于:性能

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

Java 11 才引入,目前仍是实验性质线程

启用

能够经过:-XX:+UseZGC启用ZGC; 还须要带上:-XX:+UnlockExperimentalVMOptions(解锁隐藏vm选项)code

堆空间大小设定

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

由于ZGC是并发执行,因此最大堆空间必须设定:资源

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

并发GC的线程数

对于ZGC并发执行GC的线程数量,能够经过:-XX:ConcGCThreads设定。io

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

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

GC选用策略

若是不是对暂停时间有特殊要求,那么请尽可能让VM本身来选择GC策略。im

若是须要,还能够经过调整堆区大小,来改进性能。若是还不能达到性能要求,能够从如下几个方面来选择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,在多核环境下改善总体吞吐量
相关文章
相关标签/搜索