描述
不同 GC 算法类型(Serial、Parallel、G1、CMS)将创建数量不同的默认垃圾回收线程。有关创建的默认线程数详情如下所述。有时,系统会根据默认配置创建过多无用的 GC 线程。我们曾经见过基于默认配置创建 128、256、512 个 GC 线程的情况。太多的 GC 线程也会影响应用程序性能。所以我们应该谨慎配置 GC 线程数量。
Parallel GC
如果您所使用的是 Parallel GC 算法,那么 GC 线程的数量将受到 -XX:ParallelGCThreads 属性控制。Linux/x86 机器上的 XX:ParallelGCThreads 默认值将根据以下公式得出:
if (num of processors <=8) {
return num of processors; } else {
return 8+(num of processors-8)*(5/8);
}
因此,如果您的 JVM 运行于有 32 个处理器的服务器上,那么 ParallelGCThread 值将为 23,即:8 + (32 – 8)*(5/8)。
CMS GC
如果您使用的 CMS GC 算法,那么 GC 线程的数量将由 -XX:ParallelGCThreads 与 -XX:ConcGCThreads 属性控制。-XX:ConcGCThreads 的默认值将根据以下公式得出:
max((ParallelGCThreads+2)/4, 1)
因此,如果您的 JVM 运行于有 32 个处理器的服务器上,那么
- ParallelGCThread 值将为 23,即 8 + (32 – 8)*(5/8)
- ConcGCThreads 值将为:6。
- 所以总 GC 线程数为:29(ParallelGCThread 数 + ConcGCThreads,即:23 + 6)
G1 GC
如果您使用的 G1 GC 算法,那么 GC 线程的数量将由 -XX:ParallelGCThreads、-XX:ConcGCThreads 与 -XX:G1ConcRefinementThreads 属性控制。-XX:G1ConcRefinementThreads 的默认值将根据以下公式得出:
ParallelGCThreads+1
因此,如果您的 JVM 运行于有 32 个处理器的服务器上,那么
- ParallelGCThread 值将为 23,即 8 + (32 – 8)*(5/8)
- ConcGCThreads 值将为:6
- G1ConcRefinementThreads 的值将为 24(即:23+1)
- 所以总 GC 线程数为:53(ParallelGCThread 数 + ConcGCThreads + G1ConcRefinementThreads,即:23 + 6 + 24)
53 个 GC 线程,这个数量非常高了。显然我们应该将其降低。
为什么要将其命名为多清道夫?
清道夫是寻找和清理丢弃物品的人。GC 线程的工作也是如此。同一个地方的清道夫太多并不会带来富有成效的结果。类似的,过多 GC 线程也无法为 JVM 带来帮助。
Leave a Reply