1. ParallelGCThreads 参数含义
在讲这个参数之前,先谈谈 JVM 垃圾回收(GC)算法的两个优化标的:吞吐量和停顿时长。JVM 会使用特定的 GC 收集线程,当 GC 开始的时候,GC 线程会和业务线程抢占 CPU 时间,吞吐量定义为 CPU 用于业务线程的时间与 CPU 总消耗时间的比值。为了承接更大的流量,吞吐量越大越好。
为了安全的垃圾回收,在 GC 或者 GC 某个阶段,所有业务线程都会被暂停,也就是 STW(Stop The World),STW 持续时间就是停顿时长,停顿时长影响响应速度,因此越小越好。
这两个优化目标是有冲突的,在一定范围内,参与 GC 的线程数越多,停顿时长越小,但吞吐量也越小。生产实践中,需要根据业务特点设置一个合理的 GC 线程数,取得吞吐量和停顿时长的平衡。
目前广泛使用的 GC 算法,包括 PS MarkSweep/PS Scavenge, ConcurrentMarkSweep/ParNew, G1 等,都可以通过 ParallelGCThreads 参数来指定 JVM 在并行 GC 时参与垃圾收集的线程数。该值设置过小,GC 暂停时间变长影响 RT,设置过大则影响吞吐量,从而导致 CPU 过高。
2. ParallelGCThreads 参数设置
GC 并发线程数可以通过 JVM 启动参数: -XX:ParallelGCThreads=<N>来指定。在未明确指定的情况下,JVM 会根据逻辑核数 ncpus,采用以下公式来计算默认值:
◦当 ncpus 小于 8 时,ParallelGCThreads &#