如何确定java.exe是32位还是64位?

5
我有一台装有Windows 7 Professional 64位操作系统的笔记本电脑。它有一个包含java.exe的C:\ProgramData\Oracle\Java\javapath文件夹。我要如何知道这个JVM是32位还是64位的?我右键单击它并打开“属性”窗口,然后在“详细信息”选项卡下,文件版本为8.0.1210.13。但是没有提供关于它是32位还是64位的信息。

不是逐字翻译,但可参考以下链接:https://dev59.com/D3I95IYBdhLWcg3w_zQN#2062263 - Pshemo
确保您知道路径中始终存在的内容,因为“java -cp ......”将使用该路径,而不是硬编码的路径。 - efekctive
3个回答

9
你可以运行C:\ProgramData\Oracle\Java\javapath\java.exe -version。在打印的详细信息中,你应该能看到它是32位还是64位版本。
32位版本将返回关于“客户端VM”或“服务器VM”的某些内容,而64位版本则会明确说明。
例如,我的机器输出的内容如下(诚然,这是在Fedora 25上,但原理应该适用):
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b14)
OpenJDK 64-Bit Server VM (build 25.121-b14, mixed mode)

这取决于路径上首先找到的JVM。 - srh
2
@srh:显然,如果你想要一个特定的java.exe,那么请使用C:\ProgramData\Oracle\Java\javapath\bin\java -version - T.J. Crowder
2
@srh,当然,你应该明确地在要评估的可执行文件上运行它,而不是依赖于PATH。尽管如此,我会编辑我的答案以使其更清晰。 - Mureinik
我得到了这个结果:java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode, sharing)。所以根据你的回答,它是32位的吗? - srh
@srh 是的,那是一个32位的Java。 - Mureinik

3
你可以检查os.arch
System.out.println(System.getProperty("os.arch"));

32位架构通常用x86_32或简写为x86表示,而64位架构则用x86_64表示。


1
这决定了 主机 操作系统的架构。幸运的是,在Windows上,对于所有主机操作系统位数和JVM位数的组合,这都返回所需的值。具体来说,如果一个32位JVM在WoW64模拟器中运行,操作系统会向其撒谎,报告一个32位的架构。这实际上更像是一种巧合式的编码策略,而非真正的解决方案。 - IInspectable
1
@IInspectable 至少在 Windows 上,os.arch 不是主机操作系统。它是 进程 架构。试一下,或阅读 https://dev59.com/yWgv5IYBdhLWcg3wHNDG#37028080 - Kevin Smyth
根据文档,"os.arch"属性返回“操作系统架构”。您提供的链接讨论了JVM的实现,它简单地采取捷径来实现我在先前评论中解释的内容。它报告调用进程的位数,因为这正是操作系统报告的,即使是虚假的。如果竞争的JVM实现选择报告真实的操作系统架构,则此解决方案将失败。 - IInspectable

0

要可靠地确定可执行映像的位数,您需要工具支持。这可以是一个十六进制编辑器,用于检查PE Image的内容。按照以下步骤可以确定二进制文件的机器类型:

  1. 移动到位置0x3c,并记录那里4个字节的值(小端序)。这些是从文件开头到PE签名的偏移量。
  2. 移动到步骤1中记录的位置,并验证4个字节的值是否为0x500x450x000x00PE\0\0)。这是PE映像的标志。如果值不同,则不是可执行映像。
  3. 跳过签名并注意下2个字节(小端序)。此值表示二进制映像的机器类型。
  4. 将该值与支持的Machine Types进行比较:
    • 0x014c对应于x86(32位)。
    • 0x8664对应于x64(64位)。

虽然简单可靠,但需要一定的小心。使用其他工具可以更容易地完成。如果您安装了Visual Studio,则可以使用DUMPBIN通过在命令提示符下执行以下命令来报告机器类型:

dumpbin.exe /HEADERS <path\to\executable\image> | findstr machine

这将产生以下输出(分别为x86和x64):

         14C machine (x86)

or

        8664 machine (x64)

如果您没有Visual Studio或不想安装它,您可以使用Process Explorer来确定正在运行的进程的位数。为此,请右键单击进程树视图中的相应进程,然后选择属性...。在映像选项卡上,您将看到进程的位数。


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