线程转储文件分析模式 – 多清道夫

描述

不同 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

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Blog at WordPress.com.

Up ↑

%d bloggers like this: