我如何知道我的应用程序运行的JVM是32位还是64位?具体来说,我可以在程序中使用哪些函数或属性来检测这一点?


当前回答

获取当前运行程序的JVM版本

System.out.println(Runtime.class.getPackage().getImplementationVersion());

其他回答

你检索系统属性,标记这个JVM的位:

System.getProperty("sun.arch.data.model");

可能的结果是:

“32” – 32 位 JVM “64” – 64 位 JVM “未知” – 未知 JVM

如热点常见问题解答所述:

在编写Java代码时,如何区分32位和64位操作? 没有公共API允许你区分32位和64位操作。把64位看作是编写一次,随处运行的传统的另一个平台。然而,如果你想编写特定于平台的代码,系统属性sun.arch.data.model的值是"32"、"64"或"unknown"。

需要这样做的一个例子是,如果您的Java代码依赖于本机库,并且需要确定在启动时是加载32位版本的库还是64位版本的库。

对于某些版本的Java,您可以使用标记-d32和-d64从命令行检查JVM的位。

$ 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 7中添加的,在Java 9中已弃用,在Java 10中被删除,并且在Java的现代版本中不再可用。

在Linux上,您可以使用以下两个命令之一来获取ELF头信息:

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p: ELF 64位LSB可执行文件,AMD x86-64,版本1 (SYSV),适用于GNU/Linux 2.4.0,动态链接(使用共享库),适用于GNU/Linux 2.4.0,未剥离

or

readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'

o / p: 类 : ELF64

补充信息:

在一个正在运行的进程中(至少在一些最新的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。“操作系统。Arch”也可以。

还支持其他场景:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

然而,还要考虑到这一点:

注意-此实用程序不受支持,并且在JDK的未来版本中可能可用,也可能不可用。在dbgent.dll不存在的Windows系统中,需要安装“用于Windows的调试工具”才能使这些工具工作。此外,PATH环境变量应该包含目标进程使用的jvm.dll的位置或产生崩溃转储文件的位置。

获取当前运行程序的JVM版本

System.out.println(Runtime.class.getPackage().getImplementationVersion());