java - 如何判断我是在64位JVM还是32位JVM(从程序中运行)?
如何判断我的应用程序运行的JVM是32位还是64位? 具体来说,我可以访问什么功能或偏好来在程序中检测到这个?
10个解决方案
646 votes
您可以尝试命令行:
java -d64 -version
如果它不是64位版本,您将收到如下消息:
此Java实例不支持64位JVM。 请安装所需的版本。
有关更多信息,请参阅JVM的帮助选项java -help
gpampara answered 2019-01-21T18:42:14Z
302 votes
Sun有一个Java System属性来确定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 HotSpot FAQ:
编写Java代码时,我该怎么做 区分32位和64位 操作?
没有允许您的公共API 区分32位和64位 操作。 将64位视为公正 写一次的另一个平台, 在任何地方运行。 但是,如果 你想编写的代码是 特定的平台(羞辱你), 系统属性sun.arch.data.model 具有值“32”,“64”或 “未知”。
唯一的好理由是你的java 代码依赖于本机库 并且您的代码需要确定哪个 在启动时加载的版本(32或64位)。
codaddict answered 2019-01-21T18:41:34Z
169 votes
只需在控制台中输入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)
注意java -version而不是第三行中的64-Bit Server。 Client/Server部分无关紧要,重要的是缺少64-Bit。
如果系统上安装了多个Java版本,请导航到要检查的Java版本的/ bin文件夹,然后在那里键入java -version。
Sedat Kilinc answered 2019-01-21T18:43:02Z
32 votes
再次更新:
我安装了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
这是针对SUN和IBM JVM(32位和64位)进行测试的。 显然,系统属性不仅仅是操作系统。
bryantsai answered 2019-01-21T18:43:37Z
13 votes
补充信息:
在正在运行的进程中,您可以使用(至少使用一些最新的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的位置或生成Crash Dump文件的位置。“
dim answered 2019-01-21T18:44:37Z
6 votes
在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:分类:ELF64
jawsnnn answered 2019-01-21T18:45:14Z
6 votes
如果您使用的是JNA,则可以检查com.sun.jna.Native.POINTER_SIZE == 4(32位)或com.sun.jna.Native.POINTER_SIZE == 8(64位)。
Anthony Hayward answered 2019-01-21T18:45:36Z
1 votes
在“程序|程序和功能”下的“控制面板”中的Windows 7下,JRE&的64位变体。 JDK在括号中列出“64位”(例如“Java SE Development Kit 7 Update 65(64-Bit)”),而对于32位变体,括号中没有提到变体(例如“Java SE Development”) 套件8更新60“)。
user1364368 answered 2019-01-21T18:45:58Z
0 votes
对于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上使用本机代码,因此无论如何平台独立性都是不可能的。
BullyWiiPlaza answered 2019-01-21T18:46:39Z
-1 votes
获取当前运行该程序的JVM版本
System.out.println(Runtime.class.getPackage().getImplementationVersion());
Sherlock Smith answered 2019-01-21T18:47:01Z