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


当前回答

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

其他回答

如果您使用的是JNA,您可以检查com.sun.jna.Native. net是否为JNA。POINTER_SIZE == 4(32位)或com.sun.jna.Native。指针大小== 8(64位)。

在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

如果你正在使用JNA,你可以使用thisPlatform.is64Bit()。

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

补充信息:

在一个正在运行的进程中(至少在一些最新的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的位置或产生崩溃转储文件的位置。