如何确定运行我的应用程序的JVM是32位还是64位?具体来说,我可以在程序中使用哪些函数或属性来检测到这一点?
如何确定运行我的应用程序的JVM是32位还是64位?具体来说,我可以在程序中使用哪些函数或属性来检测到这一点?
Answers:
您使用以下方法检索标记此JVM的位数的系统属性:
System.getProperty("sun.arch.data.model");
可能的结果是:
"32"
– 32位JVM"64"
– 64位JVM"unknown"
–未知的JVM编写Java代码时,如何区分32位和64位操作?
没有公共的API可以区分32位和64位操作。认为64位只是一次编写,可在任何地方运行的传统平台。但是,如果您要编写特定于平台的代码(很可惜),则系统属性sun.arch.data.model的值为“ 32”,“ 64”或“ unknown”。
例如,如果您的Java代码依赖于本机库,那么您可能需要这样做,您需要确定在启动时是加载32位还是64位版本的库。
sun.*
通过IBM JVM 找到系统属性。换句话说,它不是便携式的。
对于某些版本的Java,您可以从命令行使用标志-d32
和来检查JVM的位-d64
。
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
要检查64位JVM,请运行:
$ java -d64 -version
如果它不是64位JVM,则会得到以下信息:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
同样,要检查32位JVM,请运行:
$ java -d32 -version
如果不是32位JVM,您将获得以下信息:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
java -d32 -version
以验证您没有运行32位。双方都希望继续努力Win7
。
java -d32 -version
也从 收到“无法识别的选项”错误java -d64 -version
。
只需输入java -version
您的控制台即可。
如果运行的是64位版本,则会显示以下消息:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
32位版本将显示类似于以下内容:
java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)
请注意,Client
而不是64-Bit Server
在第三行。该Client/Server
部分无关紧要,重要的是缺少它64-Bit
。
如果系统上安装了多个Java版本,请导航至要检查的Java版本的/ bin文件夹,然后在其中键入java -version
。
我安装了32位JVM并再次尝试,如下所示确实告诉了您JVM位,而不是OS架构:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM
已针对SUN和IBM JVM(32位和64位)进行了测试。显然,系统属性不仅仅是操作系统的体系结构。
os.arch
有许多可能的值,很难分辨是32位还是64位。参见lopica.sourceforge.net/os.html
补充信息:
您可以在运行的进程上使用(至少与某些最新的Sun JDK5 / 6版本一起使用):
$ /opt/java1.5/bin/jinfo -sysprops 14680 | grep sun.arch.data.model
Attaching to process ID 14680, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
sun.arch.data.model = 32
其中14680是运行应用程序的jvm的PID。“ os.arch”也可以。
还支持其他方案:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
但是,请考虑以下注意事项:
“ 注意 -此实用程序不受支持,在JDK的未来版本中可能会或可能不可用。在不存在dbgent.dll的Windows系统中,需要安装“ Windows调试工具”才能使这些工具正常工作。 PATH环境变量应包含目标进程使用的jvm.dll的位置或从中生成故障转储文件的位置。”
如果使用的是JNA,则可以检查com.sun.jna.Native.POINTER_SIZE == 4
(32位)还是com.sun.jna.Native.POINTER_SIZE == 8
(64位)。
对于Windows
,您可以检查Java
家庭位置。如果它包含(x86)
它32-bit
,否则64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
示例路径:
C:\Program Files (x86)\Java\jdk1.8.0_181\bin\java.exe # 32-bit
C:\Program Files\Java\jdk-10.0.2\bin\java.exe # 64-bit
Windows
唯一的解决方案?如果您需要知道您运行的是哪个版本,则可能会在本机代码上随意摆弄,Windows
因此平台无关性始终不在窗口之内。
获取当前正在运行程序的JVM版本
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
或类似的内容null
,Java 10
并且始终无法回答问题。