启动 Java 时使用 -d32 和 -d64

Posted

技术标签:

【中文标题】启动 Java 时使用 -d32 和 -d64【英文标题】:Usage of -d32 and -d64 while launching Java 【发布时间】:2015-09-13 17:45:03 【问题描述】:

我阅读了以下来自JDK FAQ's的摘录

如何在 32 位和 64 位操作之间进行选择?默认是什么? 选项 -d32 和 -d64 已添加到 Java 启动器中以 指定程序是以 32 位还是 64 位运行 环境。在 Solaris 上,这些对应于 ILP32 和 LP64 数据 模型,分别。由于 Solaris 同时具有 32 位和 64 位 J2SE 包含在同一 Java 安装中的实现,您可以 指定任一版本。如果既没有指定 -d32 也没有指定 -d64,则 默认是在 32 位环境下运行。

现在为了测试这一点,我登录了我的 64 位 Ubuntu 客户操作系统并安装了 64 位 JDK 版本 - Linux x64 165.24 MB jdk-8u45-linux-x64.tar.gz

安装 JDK 后,当我使用 -d64 运行我的 java 程序时,一切都按预期进行,因为它实际上是 64 位安装,但是当我使用 -d32 时,我收到错误提示 Error - This Java instance does not support 32 bit JVM

错误对我来说是可以理解的,但让我感到困惑的是这一行(如上面引用的段落)“选项 -d32 和 -d64 已添加到 Java 启动器中,以指定 程序 将在 32 位或 64 位环境中运行。” 根据这一行,我的理解是在启动64位版本的Java时,可以使用-d32以32位模式启动它。

问题:

    我的理解正确吗?如果它是正确的,那么我会出错吗? 如果我的理解不正确,那我为什么需要这些命令行参数,因为当我使用java 启动 Java 时,我的 PATH 中的任何安装(32 位或 64 位 JDK)都会启动。

【问题讨论】:

不应该将应用程序编译为 32 位以便对其执行吗? No .. 那么 Java 的“编译一次,随处运行”的意义何在 .. 可以使用 32 编译器编译 java 程序并在 64 位 JVM 中运行 .. @Danielson 不,Java 不是这样工作的。 Java 字节码是独立于平台的,你不会为 32 位或 64 位编译 Java 代码。 AFAIK 该开关仅对 Solaris 有任何影响(错误除外)。这是根据 Java Performance: The Definitive Guide 的表 4.4 得出的,我自己从未测试过。 @hagrawal 只要安装了 32 位和 64 位软件包,-d32 和 -d64 就可以在 Solaris 上正常工作,但在其他平台上则不然。 (尽管在 Linux 上 64 位 JVM 也接受 -d64) 【参考方案1】:

你的引文:

选项 -d32 和 -d64 已添加到 Java 启动器,以指定程序是在 32 位还是 64 位环境中运行。

仅对 Solaris 操作系统有效。

稍后在JDK's FAQ,我们可以阅读:

所有其他平台(Windows 和 Linux)都包含单独的 32 位和 64 位安装包。如果两个软件包都安装在一个系统上,您可以通过将适当的“bin”目录添加到您的路径来选择其中一个。为保持一致性,Linux 上的 Java 实现接受 -d64 选项。

所以回答你的第二个问题,在 Windows 和 Linux 中,这些标志是无用的,32/64 位的选择是通过运行相应的 JVM 安装来完成的。

【讨论】:

感谢您的意见。我确实从 JDK FAQ 中读到了这一点,这就是我在第二个问题中提出的问题。我必须在 PATH 变量中添加“bin”路径,然后基本上 -d32 和 -d64 将失去效果,因为如果 32 安装在 PATH 中,那么 -d64 将不起作用。我同意您的观点,即 -d32 和 -d64 仅适用于 Solaris。 谢谢。您是否曾在 Solaris 上工作过?我想知道在 Solaris 中发生了什么事情,JDK 安装路径将在某些环境中设置/导出。变量还是路径?如果是这样,那么如果设置了 32 位路径并且在启动 Java 时使用了 -d64 会发生什么?? 我很久以前就在 Solaris 上工作...在常见问题解答中,它写成 you must first install the 32-bit SDKor JRE and then select and install the 64-bit package on top of the 32-bit version。这可能意味着,有一个入口点,然后通过-d32/-d64 完成选择 我认为这是在所有讨论之后唯一有意义的事情,即仅在 Solaris 中您可以使用 -d32 和 -d64,以及为什么可能因为 32 位和 64 位版本都在同一个安装中,正如 JDK FAQ 中提到的那样 - Since Solaris has both a 32 and 64-bit J2SE implementation contained within the same installation of Java, you can specify either version. 但是,我一直在寻找真正掌握 Solaris 并做到这一点的人。无论如何,感谢您的投入。我会接受你的回答。

以上是关于启动 Java 时使用 -d32 和 -d64的主要内容,如果未能解决你的问题,请参考以下文章

java获取cmd启动的程序的PID

Datagrip - 无法启动

可以在Windows上为loadLibrary()修改java进程中的“路径”吗?

idea的启动类是啥文件

eclipse启动“java was started but returned exit code = 1”问题

Win32 应用程序在启动时不运行