Runtime.getRuntime().availableProcessors()
·
java.lang.Runtime.availableProcessors() 方法: 返回可用处理器的Java虚拟机的数量。
这个值可以在虚拟机中的某个调用过程中改变。应用程序是可用的处理器数量敏感,因此应该偶尔查询该属性,并适当调整自己的资源使用情况。
方法声明:public native int availableProcessors();
例子:
package com.vrv.linkdood_util;
/**
* <B>说 明<B/>:
*
* @author 作者名:冯龙淼
* E-mail:fenglongmiao@vrvmail.com.cn
*
* @version 版 本 号:1.0.<br/>
* 创建时间:2018年2月28日 下午3:53:47
*/
public class RuntimeMain{
public static void main(String arg[]){
// check the number of processors available
System.out.println(""+Runtime.getRuntime().availableProcessors());
}
}
结果:
4
然而,更大的问题在于Runtime.getRuntime().availableProcessors()也并非都能返回你所期望的数值。比如说,在我的四核1-4-1机器上,它返回的是4,这是对的。不过在我的1-4-2机器 上,也就是一个CPU插槽,4核,每个核2个超线程,这样的话会返回8。不过我其实只有4个核,如果代码的瓶颈是在CPU这块的话,我会有7个线程在同时 竞争CPU周期,而不是更合理的4个线程。如果我的瓶颈是在内存这的话,那这个测试我可以获得7倍的性能提升。
不过这还没完!Java Champions上的一个哥们发现了一种情况,他有一台16-4-2的机器 (也就是16个CPU插槽,每个CPU4个核,每核两个超线程,返回的值居然是16!从我的i7 Macbook pro上的结果来看,我觉得应该返回的是16*4*2=128。在这台机器上运行Java 8的话,它只会将通用的FJ池的并发数设置成15。正如 Brian Goetz所指出的,“虚拟机其实不清楚什么是处理器,它只是去请求操作系统返回一个值。同样的,操作系统也不知道怎么回事,它是去问的硬件设备。硬件会告诉它一个值,通常来说是硬件线程数。操作系统相信硬件说的,而虚拟机又相信操作系统说的。”
更多推荐
已为社区贡献4条内容
所有评论(0)