Runtime.availableProcessors:它将返回什么?

Java 1.6中的Runtime.availableProcessors()的javadoc是非常不明确的。 它只关注硬件配置,还是负载? 它是否足够智能以避免被超线程所愚弄? 它是否通过linux taskset命令尊重一组有限的处理器?

我可以添加一个我自己的数据点:在这里有12个内核和超线程的计算机上,Runtime.availableProcessors()确实返回24,这不是一个很好的数字,用于决定尝试运行多少个线程。 机器显然没有死机,因此也无法以任何有效的方式查看负载。

AFAIK,它总是为您提供可用CPU的总数,即使那些不可用于调度的CPU也是如此。 我有一个库,使用这个事实来找到保留的cpus。 我读取了/ proc / cpuinfo和进程的默认线程关联,以确定可用的内容。

在Windows上,使用GetSystemInfo和返回的SYSTEM_INFO结构中的SYSTEM_INFO

这可以从OpenJDK源代码的os_windows.cpp中的void os::win32::initialize_system_info()int os::active_processor_count()os_windows.cpp

来自MSDN文档的dwNumberOfProcessors表示它报告“当前组中的逻辑处理器数量”,这意味着超线程将增加报告的CPU数量。

在Linux上, os::active_processor_count()使用sysconf :

 int os::active_processor_count() { // Linux doesn't yet have a (official) notion of processor sets, // so just return the number of online processors. int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN); assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check"); return online_cpus; } 

其中_SC_NPROCESSORS_ONLN文档显示“当前在线(可用)的处理器数量”。 这不受过程亲和力的影响,也受超线程的影响。

根据Sun Bug 6673124 :

Runtime.availableProcessors()使用的active_processor_count代码如下:

 int os::active_processor_count() { int online_cpus = sysconf(_SC_NPROCESSORS_ONLN); pid_t pid = getpid(); psetid_t pset = PS_NONE; // Are we running in a processor set? if (pset_bind(PS_QUERY, P_PID, pid, &pset) == 0) { if (pset != PS_NONE) { uint_t pset_cpus; // Query number of cpus in processor set if (pset_info(pset, NULL, &pset_cpus, NULL) == 0) { assert(pset_cpus > 0 && pset_cpus <= online_cpus, "sanity check"); _processors_online = pset_cpus; return pset_cpus; } } } // Otherwise return number of online cpus return online_cpus; } 

此特定代码可能是特定于Solaris的。 但我认为这种行为在其他平台上至少会有些相似。