Java G1和x27;平行线程

Java G1和x27;平行线程,java,garbage-collection,g1gc,Java,Garbage Collection,G1gc,最近,为了提高性能,我打开了jvm选项。 当我学习GC选项时,我遇到了一个问题。 我认为ParallelGCThreads的最佳值是逻辑处理器的数量。但是在我的32核机器上,默认值是23。从oracle的文章中可以看出,处理器计数大于8,ParallelGCThreads的默认值是处理器的5/8。 那么,为什么它是5/8而不是8/8呢?提示,在非常大的CPU或多CPU系统上,额外线程的回报会越来越小,因此线性比例因子会降低到8个核以上 这可能是因为GCing本身就有内存限制,足够多的线程最

最近,为了提高性能,我打开了jvm选项。 当我学习GC选项时,我遇到了一个问题。

我认为ParallelGCThreads的最佳值是逻辑处理器的数量。但是在我的32核机器上,默认值是23。从oracle的文章中可以看出,处理器计数大于8,
ParallelGCThreads
的默认值是处理器的5/8。
那么,为什么它是5/8而不是8/8呢?

提示,在非常大的CPU或多CPU系统上,额外线程的回报会越来越小,因此线性比例因子会降低到8个核以上

这可能是因为GCing本身就有内存限制,足够多的线程最终会使内存总线饱和,无法提供额外的内核。此外,GC线程之间的协调(工作分区)可能会变得更加低效,因为每个线程只能在堆的较小部分上工作


无论如何,这不是一个一刀切的规则,因此您可以更改设置,测量它并保留更改(如果可以确认改进)。

您希望所有逻辑内核都运行GC吗?你到底为什么要那样?你想让你的CPU做工作还是收集垃圾?是的,更多的CPU做gc导致更少的时间停止CPU做实际工作。默认情况下,使用所有内核进行垃圾收集是愚蠢的。但是当内核数小于或等于8时,gc线程的默认计数就是内核数。@Kayaman他说的是
ParallelGCThreads
,而不是
CongcThreads