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

Bob*_*Gee 552 java 64-bit java-native-interface jvm 32-bit

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

gpa*_*ara 690

您可以尝试命令行:

$ java -help
...
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available
Run Code Online (Sandbox Code Playgroud)

如果它不是64位版本,您将收到如下消息:

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

有关详细信息,请参阅JVM的帮助选项 -d32

  • 不要使用"-D64",因为那样做完全不同.它定义了一个名为"64"的系统属性.这绝对不是这里想要的. (40认同)
  • 我在Windows 7上,我从`java -d32 -version`*以及*`java -d64 -version`中得到'无法识别的选项'错误. (31认同)
  • 正是我在寻找什么.你可以运行`java -d32 -version`来验证你没有运行32位.两人都希望在"Win7"上工作. (13认同)
  • -d32或-d64标志仅适用于Java 7或更高版本. (9认同)
  • 虽然这很有用,但它没有用b/c我需要从程序外部运行它或使用java选项来启动一个新进程. (3认同)
  • 注意:-d64标志在Windows上不起作用. (3认同)
  • 在Java 9中已删除此参数,请参见[JDK-8168010](https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8168010)。另外,由于Solaris同时支持JDK8之前的版本,因此它可能无法可靠地满足“从程序内部”的需求,因此,您当前可能正在使用32位数据模型运行,但是返回的java_d64 -version退出代码为0。 (3认同)
  • 不需要 -version 参数。您可以使用`java -d64`。 (2认同)

cod*_*ict 311

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

System.getProperty("sun.arch.data.model");
Run Code Online (Sandbox Code Playgroud)

您可以使用

System.getProperty("sun.arch.data.model");
Run Code Online (Sandbox Code Playgroud)

从程序中确定其是否为32/64.

来自Sun HotSpot FAQ:

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

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

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

  • 我不希望在IBM JVM中找到`sun.*`系统属性.换句话说,它不便携. (21认同)
  • 为什么接受的答案是Sun依赖的?"os.arch"将完成同样的事情,而不必使用专有的太阳包. (17认同)
  • 你如何从命令行告诉?如果您运行的是32位或64位?只是好奇. (8认同)
  • @ b1naryatr0phy,os.arch报告操作系统或JVM?我经常在我的64位工作站上运行32位JVM,用于开发目的. (7认同)
  • IBM JVM支持此属性,但GCJ不支持此属性.请参见http://stackoverflow.com/questions/807263/how-do-i-detect-which-kind-of-jre-is-installed-32bit-vs-64bit (7认同)
  • 由于GCJ像死亡一样死了,它所做的和不支持的是没有兴趣的. (3认同)

Sed*_*inc 181

只需输入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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

注意Client而不是64-Bit Server在第三行.这Client/Server部分是无关紧要的,没有64-Bit重要的.

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

  • OP在程序中明确说**. (27认同)

bry*_*sai 34

再次更新:

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

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

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

  • @codaddict这是完全错误的(我不知道为什么有六个人投票赞成这个评论.)"os.arch"旨在返回JVM版本.如果您真的依赖于此操作系统检测,请自行测试并帮助您. (20认同)
  • 这给出了操作系统架构信息.如果我没错,这不一定与JVM位相同. (7认同)
  • `os.arch`有许多可能的值,很难判断它是32位还是64位.见http://lopica.sourceforge.net/os.html (6认同)
  • @codaddict,看起来确实是JVM的比特. (2认同)
  • 这是一个用于人眼的字符串,没有严格定义有效值,依赖于这不是一个好主意 - 编写代码来检查实际功能. (2认同)

dim*_*dim 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
Run Code Online (Sandbox Code Playgroud)

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

还支持其他方案:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 
Run Code Online (Sandbox Code Playgroud)

不过也要考虑这个说明:

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


jaw*_*nnn 7

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

file {YOUR_JRE_LOCATION_HERE}/bin/java
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

o/p:等级:ELF 64


Ant*_*ard 6

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


小智 5

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

Platform.is64Bit()
Run Code Online (Sandbox Code Playgroud)