我如何知道我的应用程序运行的JVM是32位还是64位?具体来说,我可以在程序中使用哪些函数或属性来检测这一点?
当前回答
对于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上的本机代码,所以平台独立性是不可能的。
其他回答
在Linux上,您可以使用以下两个命令之一来获取ELF头信息:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: ELF 64位LSB可执行文件,AMD x86-64,版本1 (SYSV),适用于GNU/Linux 2.4.0,动态链接(使用共享库),适用于GNU/Linux 2.4.0,未剥离
or
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o / p: 类 : ELF64
我安装了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位)上进行了测试。显然,系统属性不仅仅是操作系统拱门。
如果你正在使用JNA,你可以使用thisPlatform.is64Bit()。
补充信息:
在一个正在运行的进程中(至少在一些最新的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。“操作系统。Arch”也可以。
还支持其他场景:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
然而,还要考虑到这一点:
注意-此实用程序不受支持,并且在JDK的未来版本中可能可用,也可能不可用。在dbgent.dll不存在的Windows系统中,需要安装“用于Windows的调试工具”才能使这些工具工作。此外,PATH环境变量应该包含目标进程使用的jvm.dll的位置或产生崩溃转储文件的位置。
对于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上的本机代码,所以平台独立性是不可能的。
推荐文章
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 使用String.split()和多个分隔符
- Java数组有最大大小吗?
- 在Android中将字符串转换为Uri
- 从JSON生成Java类?
- 为什么java.util.Set没有get(int index)?
- Swing和AWT的区别是什么?
- 为什么Java流是一次性的?
- 四舍五入BigDecimal *总是*有两位小数点后
- 设计模式:工厂vs工厂方法vs抽象工厂
- Java:检查enum是否包含给定的字符串?
- 它的意思是:序列化类没有声明一个静态的最终serialVersionUID字段?