Runtime.availableProcessors()Java 1.6中的javadoc 是非常不明确的.它只关注硬件配置,还是负载?它是否足够智能以避免被超线程所愚弄?它是否通过linux taskset命令尊重一组有限的处理器?
我可以添加一个我自己的数据点:在这里有12个内核和超线程的计算机上,Runtime.availableProcessors()确实返回24,这不是一个好的数字,用于决定尝试运行多少个线程.机器显然没有死机,因此也无法以任何有效的方式查看负载.
在Windows上,使用GetSystemInfo并dwNumberOfProcessors从返回的SYSTEM_INFO结构中使用.
这可以从中可以看出void os::win32::initialize_system_info(),并int os::active_processor_count()在os_windows.cppOpenJDK的源代码.
dwNumberOfProcessors,从MSDN文档中说它报告'当前组中的逻辑处理器数',这意味着超线程将增加报告的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;
}
Run Code Online (Sandbox Code Playgroud)
当_SC_NPROCESSORS_ONLN文件说,"处理器的数量目前在线(可用)." 这不受过程亲和力的影响,也受超线程的影响.
AFAIK,它总是为您提供可用 CPU 的总数,甚至是那些不可用于调度的 CPU。我有一个库,它使用这个事实来查找保留的CPU。我读取了 /proc/cpuinfo 和进程的默认线程亲和力来找出可用的内容。