我怎么知道我在64位JVM或32位JVM(从程序中)运行?

如何判断我的应用程序运行的JVM是32位还是64位? 具体来说,我可以访问什么功能或偏好来检测程序中的这个?

Sun有一个Java系统属性来确定JVM的位数:32或64:

sun.arch.data.model=32 // 32 bit JVM sun.arch.data.model=64 // 64 bit JVM 

您可以使用

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

从程序中确定它是否是32/64。

从Sun热点FAQ :

在编写Java代码时,如何区分32位和64位操作?

没有公共的API可以让你区分32位和64位操作。 把64位看作是一次写入的另一个平台,随处运行传统。 但是,如果您想要编写特定于平台的代码(对您sun.arch.data.model ),则系统属性sun.arch.data.model的值为“32”,“64”或“unknown”。

唯一的好理由是,如果你的java代码依赖于本地库,你的代码需要确定在启动时加载哪个版本(32或64位)。

你可以尝试在命令行上:

 java -d64 -version 

如果不是64位版本,则会显示如下所示的消息:

此Java实例不支持64位JVM。 请安装所需的版本。

请参阅JVM的帮助选项以获取更多信息java -help

只需在控制台中输入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 ServerClient/Server部分是无关紧要的,这是没有64-Bit重要。

如果您的系统上安装了多个Java版本,请导航到要检查的Java版本的/ bin文件夹,然后在其中键入java -version

再次更新

我安装了32位的JVM,并重试了一遍,看起来像下面告诉你的JVM位,而不是操作系统拱:

 System.getProperty("os.arch"); # # on a 64-bit Linux box: # "x86" when using 32-bit JVM # "xmd64" when using 64-bit JVM 

这是针对SUN和IBM JVM(32和64位)进行测试的。 显然,系统属性不只是操作系统的拱门。

补充信息:

正在运行的进程中,您可以使用(至少在最近的一些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的位置或产生崩溃转储文件的位置。

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

 file {YOUR_JRE_LOCATION_HERE}/bin/java 

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

要么

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

o / p:Class:ELF 64

如果您使用的是JNA,则可以检查com.sun.jna.Native.POINTER_SIZE == 4 (32位)或com.sun.jna.Native.POINTER_SIZE == 8 (64位)。

在“ 程序|程序和功能 ”下的“ 控制面板 ”中的Windows 7下,JRE和JDK的64位变体在括号中以“ 64位 ”列出(例如“ Java SE Development Kit 7 Update 65(64-Bit ) “),而对于32位变体,在括号中没有提及该变体(例如” Java SE Development Kit 8 Update 60 “)。

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

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