Java 获取dualsocket服务器上的可用线程数

Java 获取dualsocket服务器上的可用线程数,java,hardware,Java,Hardware,我需要获得机器上可用CPU线程的数量。 以前我使用Runtime.getRuntime().availableProcessors()来确定这一点,它在家里的PC上运行正常。在我的例子中,它返回16(因为我有一个8核、16线程的处理器)。 现在我想在具有双套接字配置的服务器上使用该应用程序,两个Xeon Gold 6154,每个具有18个内核/36个线程。我过去确定线程数量的方法现在给了我36,而不是72 似乎AvailableProcessors()方法不考虑双套接字配置 我通过一些研究发现,

我需要获得机器上可用CPU线程的数量。 以前我使用
Runtime.getRuntime().availableProcessors()
来确定这一点,它在家里的PC上运行正常。在我的例子中,它返回
16
(因为我有一个8核、16线程的处理器)。 现在我想在具有双套接字配置的服务器上使用该应用程序,两个Xeon Gold 6154,每个具有18个内核/36个线程。我过去确定线程数量的方法现在给了我
36
,而不是
72

似乎
AvailableProcessors()
方法不考虑双套接字配置

我通过一些研究发现,
java.util.concurrent.ForkJoinPool.commonPool()。但是,在我的本地PC上,它返回
java.util.concurrent。ForkJoinPool@61e717c2[Running,parallelism=15,size=0,active=0,Running=0,steals=0,tasks=0,submissions=0]
aka缺少一个线程。。。这正常吗?我需要做一些数学运算,把数字加上1吗?输出的格式也不是很好,我必须做一些正则表达式或类似的操作才能使其成为可用的格式


有没有更好的方法来确定机器上的线程数量?或者我现在必须坚持使用commonPool()方法吗?

默认情况下
ForkJoinPool.commonPool()
将有
可用处理器()-1个线程,如果
可用处理器()
>1个线程,否则为1个线程

这是ForkJoinPool.java源代码的一部分:

if (parallelism < 0 && // default 1 less than #cores
   (parallelism = Runtime.getRuntime().availableProcessors() - 1) <= 0)
        parallelism = 1;
if(并行度<0&//default 1小于#核心

(parallelism=Runtime.getRuntime().availableProcessors()-1)运行时返回的处理器数量。getRuntime().availableProcessors()是操作系统报告的处理器数量。这是从Java使用的有效数字。根据经验,
availableProcessors()
确实支持双套接字体系结构。如果数字不是您期望的数字,那么您需要查看正在运行的JVM、操作系统和BIOS的配置和功能。具体查看您正在使用的操作系统如何向其进程报告可用CPU数


这可能会对您有所帮助。您可能知道,超线程并不是一个真正的额外CPU。它本质上是将一个CPU分时使用,该CPU对并行操作有相当多的支持;这可能会或可能不会为不同类型的工作负载提供性能提升。这是许多操作系统增加对线程支持的最快方法“每线程”是将它们报告为额外CPU;但这不是唯一可以这样做的方法。如果在bios或操作系统级别关闭了“超线程”支持,则CPU计数通常会受到影响。

感谢您,但:我启动它时没有使用-server标志或-client标志,而是使用Java 7,并在Windows server上运行它。所以我想这并没有什么帮助。@Mining\u Pickaxe服务器上有jre或jdk吗?是64位还是32位?我运行jre,它嵌入到一个文件中。exe@Mining_Pickaxe32位还是64位?64位…很抱歉没有指定任务管理器报告:套接字:2,内核:36,线程:72。我知道超线程是如何工作的,java应用程序的功能如下一个用于启动渲染应用程序的包装器(可以从超线程中获益),我需要用它解析可用线程的数量it@Mining_Pickaxe什么操作系统和版本,它是容器化的(如果是,版本和配置),Java的哪个版本,操作系统配置为将进程固定到线程。您需要做更多的挖掘来理解和影响这种行为。只需知道AvailableProcessor是正确的调用方法。如果您对其返回值不满意,并且希望能够尝试不同的值,那么请考虑在分配要创建的线程数时添加配置覆盖。然后可以调整每个环境的线程数。