如何判断我是在64位JVM还是32位JVM(从程序中运行)?

问题描述 投票:538回答:11

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

java jvm java-native-interface 64bit 32-bit
11个回答
311
投票

您可以使用以下命令检索标记此JVM的位数的system property

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

可能的结果是:

  • "32" - 32位JVM
  • "64" - 64位JVM
  • "unknown" - 未知的JVM

HotSpot FAQ所述:

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

没有公共API允许您区分32位和64位操作。将64位视为一次写入中的另一个平台,随处运行。但是,如果您想编写特定于平台的代码(对您有羞耻感),则系统属性sun.arch.data.model的值为“32”,“64”或“unknown”。

这可能是必要的一个示例是,如果您的Java代码依赖于本机库,并且您需要确定是否在启动时加载32位或64位版本的库。


0
投票

如果你正在使用JNA,你可以这样做Windows


-2
投票

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

Windows

674
投票

对于某些版本的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中的qazxsw poi,Java 10中的qazxsw poi中添加,并且在现代版本的Java上不再可用。


180
投票

只需在控制台中输入deprecated即可。

如果64位版本正在运行,您将收到如下消息:

removed

32位版本将显示类似于:

java -version

请注意第三行中的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) 而不是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

如果系统上安装了多个Java版本,请导航到要检查的Java版本的/ bin文件夹,然后在那里键入Client/Server


34
投票

我安装了32位JVM并再次重试,看起来下面的内容告诉你JVM的位数,而不是OS arch:

64-Bit

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


15
投票

补充信息:

在正在运行的进程中,您可以使用(至少使用一些最新的Sun JDK5 / 6版本):

java -version

其中14680是运行应用程序的jvm的PID。 “os.arch”也有效。

还支持其他方案:

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

不过也要考虑这个说明:

$ /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 - 此实用程序不受支持,可能会或可能不会在JDK的未来版本中可用。在没有dbgent.dll的Windows系统中,需要安装'Windows调试工具'才能使这些工具正常工作。 PATH环境变量应包含目标进程使用的jvm.dll的位置或生成Crash Dump文件的位置。“


7
投票

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

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

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

要么

NOTE

o / p:类:ELF64


6
投票

如果您使用的是JNA,则可以检查file {YOUR_JRE_LOCATION_HERE}/bin/java (32位)或readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class' (64位)。


1
投票

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


0
投票

对于com.sun.jna.Native.POINTER_SIZE == 4,您可以查看com.sun.jna.Native.POINTER_SIZE == 8的家乡位置。如果它包含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 上摆弄本机代码,所以平台独立性无论如何都是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.