默认线程数按逻辑处理器数计算:≤8时等于核数,>8时为3+(5×核数)/8;该值仅适用于parallel gc,cms/g1/zgc使用各自独立参数控制并发线程。

Java 垃圾回收中,并行收集器(Parallel GC)的线程数通过 -XX:ParallelGCThreads 参数显式配置。
默认线程数怎么算?
JVM 会根据 CPU 核心数自动设定默认值: - 在多数 JDK 版本(如 JDK 8/11/17)中,若逻辑处理器数 ≤ 8,则线程数 = 逻辑处理器数; - 若 > 8,则线程数 ≈ 3 + (5 × 逻辑处理器数) / 8; - 可通过 java -XX:+PrintFlagsFinal -version | grep ParallelGCThreads 查看实际生效值。
如何手动设置线程数?
在 JVM 启动参数中添加:
-XX:ParallelGCThreads=N(N 为正整数)
例如:
- -XX:ParallelGCThreads=4 强制使用 4 个 GC 线程;
- 设为 1 时退化为单线程并行收集(不推荐生产环境);
- 超过物理核心数过多(如设为 64 而机器只有 8 核)反而可能因上下文切换导致吞吐下降。
和 CMS/G1/ZGC 的关系
该参数仅对 Parallel GC(即 -XX:+UseParallelGC 或 -XX:+UseParallelOldGC)生效:
- CMS 使用 -XX:ParallelCMSThreads 控制并发标记线程数;
- G1/ZGC 不使用此参数,它们有各自独立的并发线程控制机制(如 -XX:ConcGCThreads)。
调优建议
设置时需结合应用特征与硬件资源:
- 高吞吐、低延迟敏感场景(如批处理),可略高于 CPU 核心数(如 1.2×),但不宜翻倍;
- 容器环境注意:Docker/K8s 中若限制了 CPU quota(如 --cpus=2),JVM 默认可能仍按宿主机核数计算,此时必须显式设置 -XX:ParallelGCThreads 避免过度争抢;
- 可通过 GC 日志(-Xlog:gc*:file=gc.log:time)观察 STW 时间和 GC 线程利用率,验证是否合理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











