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

607

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


4
只是出于好奇,你为什么需要知道系统的自然大小?像这样的细节在Java中被抽象化了,所以理论上你不需要知道它们。 - Patrick Niedzielski
3
它让我大致估计由指针引起的对象的内存需求。好奇心也是如此——似乎应该有一种方法,但我从未听说过。 - BobMcGee
90
在与Java本地接口交互时,这个“细节”并没有被抽象化。64位JVM无法加载32位DLL(反之亦然)。因此,对于使用JNI的任何人来说,这是非常重要的信息。遗憾的是,似乎没有一种可移植的方法来获取这些信息。一种方法是先尝试加载32位版本的DLL,如果失败了,则尝试64位版本等。这很丑陋! - Joonas Pulakka
12
另一个需要区分32位或64位JVM的情况是对于映射文件。在32位系统中,只能映射2GB,因此重要的是相应地映射和取消映射文件段,以避免超出此限制,而在64位JVM中,这个限制要高得多得多得多。 - Simone Gianni
2
能够选择在特定机器上运行最快的数值算法真是太好了。 - dfeuer
显示剩余5条评论
13个回答

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

这并没有回答问题,即应用程序在哪个JVM上运行,32位还是64位。 - Alexey Ivanov

-3

对于 Windows,您可以查看 Java 的主目录位置。如果它包含 (x86),那么是 32 位,否则是 64 位

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上的本机代码,因此平台无关性已经不存在了。


1
这不是一个好主意,因为安装Java时可以单独选择路径。安装路径中没有“(x86)”绝对不能说明Java是否以32/64位版本提供。 - André
@André:说得对,但99%的用户都会安装到默认位置。也许可以查询“java”或“javac”实用程序,检查某些“32位”独占命令行开关是否可以工作,或者“java -version”输出中是否包括类似于“64位”的内容。 - BullyWiiPlaza
它非常不可靠。 - Alexey Ivanov

-3

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

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

这个报告是针对JVM还是操作系统的?您可以在64位操作系统上运行32位JVM。 - Thorbjørn Ravn Andersen
不使用JMX吗? - Thorbjørn Ravn Andersen
3
иҝҷдјҡиҝ”еӣһзұ»дјјдәҺ1.8.0_172жҲ–nullпјҲеңЁJava 10дёҠпјүзҡ„з»“жһңпјҢдҪҶж— и®әеҰӮдҪ•йғҪжІЎжңүеӣһзӯ”иҝҷдёӘй—®йўҳгҖӮ - BullyWiiPlaza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接