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


563

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


3
出于好奇,您为什么需要知道系统的自然大小?诸如此类的细节是用Java抽象出来的,因此您(至少在理论上)不必了解它们。
Patrick Niedzielski 2010年

3
它使我可以粗略估计由于指针导致的对象的内存需求。好奇心也是如此-似乎应该有一种方法,但我从未听说过。
BobMcGee

85
与Java本机接口交互时,不会“抽象”该“详细信息”。无法使用64位JVM加载32位DLL(反之亦然)。因此,这对于使用JNI的任何人都是非常重要的信息。很遗憾,似乎没有便携式方法来获取此信息。一种方法是先尝试加载DLL的32位版本,如果失败,请尝试64位版本,以此类推。丑陋!
乔纳斯·普拉卡

12
在32位或64位JVM之间进行区分很重要的另一种情况是映射文件。在32位系统上只能映射2GB,因此相应地映射和取消映射文件段非常重要,这样就不会超过此限制,而在64位jvm上,限制要高得多。
Simone Gianni 2012年

2
能够选择在有关机器上最快的数值算法真的很不错。
dfeuer 2014年

Answers:


317

您使用以下方法检索标记此JVM的位数的系统属性

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

可能的结果是:

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

HotSpot常见问题解答所述

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

没有公共的API可以区分32位和64位操作。认为64位只是一次编写,可在任何地方运行的传统平台。但是,如果您要编写特定于平台的代码(很可惜),则系统属性sun.arch.data.model的值为“ 32”,“ 64”或“ unknown”。

例如,如果您的Java代码依赖于本机库,那么您可能需要这样做,您需要确定在启动时是加载32位还是64位版本的库。


22
我不希望sun.*通过IBM JVM 找到系统属性。换句话说,它不是便携式的。
Pascal Thivent 2010年

8
您如何从命令行知道呢?如果运行的是32位还是64位?只是好奇。
Xonatron

17
为什么接受的答案与太阳有关?“ os.arch”将完成相同的事情,而不必使用专有的sun软件包。
b1nary.atr0phy'5

7
@ b1naryatr0phy,os.arch是否在操作系统或JVM上报告?出于开发目的,我经常在64位工作站上运行32位JVM。
skiphoppy 2012年

7
IBM JVMs支持此属性,但GCJ不支持。见stackoverflow.com/questions/807263/...
埃马纽埃尔·布尔格

707

对于某些版本的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 7中添加的,在Java 9中已弃用,在Java 10中已删除,在现代Java版本中不再可用。


3
尽管这是一个很好的了解,但它并不是有用的b / c,我需要从程序外部运行它或使用java选项来启动新进程。
BobMcGee

13
正是我想要的。您可以运行java -d32 -version以验证您没有运行32位。双方都希望继续努力Win7
Xonatron

31
我在Windows 7上,java -d32 -version 也从 收到“无法识别的选项”错误java -d64 -version
2012年

40
不要使用“ -D64”,因为这样做会完全不同。它定义了一个称为“ 64”的系统属性。这绝对不是这里想要的。
乔纳森·黑德兰

9
-d32或-d64标志仅适用于Java 7或更高版本。
darrenmc 2014年

187

只需输入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


但在hp不间断oss env中,我没有获得64位或32位
vels4j

28
OP 在程序中特别说明。
托马什Zato -恢复莫妮卡

34

我安装了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位)进行了测试。显然,系统属性不仅仅是操作系统的体系结构。


7
这提供了操作系统体系结构信息。如果我没看错,则不必与JVM位相同。
codaddict 2010年

2
@codaddict,看起来确实是JVM位。
bryantsai 2010年

20
@codaddict这完全是错误的(我不知道为什么六个人请了这个评论。)“ os.arch”旨在返回JVM版本。自己进行测试,如果您实际上是依靠OS进行检测的,那么上帝会为您提供帮助。
b1nary.atr0phy'5

6
os.arch有许多可能的值,很难分辨是32位还是64位。参见lopica.sourceforge.net/os.html
Emmanuel Bourg

2
这是一个供人眼使用的字符串,并且没有严格定义有效值,依靠它不是一个好主意-编写代码来检查实际功能。
托尔比约恩Ravn的安徒生

15

补充信息:

您可以在运行的进程上使用(至少与某些最新的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的位置或从中生成故障转储文件的位置。”


7

在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:等级:ELF 64


6

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


这很聪明,但是访问指针大小比这里的其他解决方案要慢得多(它需要一些时间来初始化)。
BullyWiiPlaza

1

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


1

如果您使用的是JNA,则可以执行此操作Platform.is64Bit()


-1

对于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因此平台无关性始终不在窗口之内。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.