java程序可以实现在指定CPU上运行吗?
java程序可以指定CPU运行吗?这是我以前遇到的一个面试问题,这两天又想起来了。一般我们都知道C、C++是可以实现程序指定CPU运行的,那么java到底可不可以呢?网上一部分人说可以,一部分人说不可以,我先说一下我搜集的资料显示是可以的,不过实现起来需要特殊的开发环境,主要就是需要安装jrockit-jdk。
一、jrockit-jdk安装
-
jrockit-jdk简介:
Oracle JRockit JVM 是业界性能最高的 Java 虚拟机,现内置于 Oracle 融合中间件中。它通过 JRockit Real Time 提供业内领先的实时基础架构功能,通过 JRockit Mission Control 提供无与伦比的 JVM 诊断。 -
下载与安装:
官网下载地址:https://www.oracle.com/java/technologies/javase-java-archive-jrockit-downloads.html
点击适合自己电脑的版本进行下载即可,下载完成后双击程序,按照程序提醒一步一步安装即可,跟普通jdk差别不大,安装完成以后:
jrockit-jdk安装完成以后,可以像普通的jdk那样进行环境变量配置:
到这里jrockit-jdk安装就算完成了。
二、编码测试
- 创建一个普通maven工程,需要选择刚刚安装好的jrockit-jdk:
项目结构:
3. 编码:
public class AppointCpuTest {
public static void main(String[] args) {
// 获取jvm对象
JVM jvm = JVMFactory.getJVM();
// 获取cpu集合的叠代对象
Iterator<CPU> cpuIterator = jvm.getProcessAffinity().iterator();
// 用于保存系统中所有cpu的集合
List<CPU> systemCpuList = new ArrayList<CPU>();
while (cpuIterator.hasNext()) {
CPU cpu = cpuIterator.next();
systemCpuList.add(cpu);
}
// 系统中cpu的个数
int cpuCount = systemCpuList.size();
// 需要绑定到jvm的cpu集合
List<CPU> bindCpuList = new ArrayList<CPU>();
// 绑定最后一个cpu运行此程序
int appointCpuIndex = cpuCount - 1;
bindCpuList.add(systemCpuList.get(appointCpuIndex));
// 将指定的cpu集合绑定到jvm中
jvm.suggestProcessAffinity(bindCpuList);
System.out.println("系统中CPU个数:" + cpuCount);
System.out.println("当前程序指定CPU运行序号:" + appointCpuIndex);
//保持程序不退出
while (true) {
}
}
}
- 运行结果:
系统中CPU个数:6
当前程序指定CPU运行序号:5
将指定CPU序号换成3,再次运行:
int appointCpuIndex = 3;
bindCpuList.add(systemCpuList.get(appointCpuIndex));
运行结果:
系统中CPU个数:6
当前程序指定CPU运行序号:3
从以上两次运行结果都可以看出来,代码成功实现了让程序在指定的CPU上运行。
一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。