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所指出的,“虚拟机其实不清楚什么是处理器,它只是去请求操作系统返回一个值。同样的,操作系统也不知道怎么回事,它是去问的硬件设备。硬件会告诉它一个值,通常来说是硬件线程数。操作系统相信硬件说的,而虚拟机又相信操作系统说的。”


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐