【问题标题】:Java programing for 64 bit JVM用于 64 位 JVM 的 Java 编程
【发布时间】:2011-03-27 15:40:10
【问题描述】:

几个问题:):

如何识别当前安装的JVM? (64位/32位)

在为 64 位 JVM 目标平台编程时是否需要考虑一些事项?

我的 Java 代码可以在 32 位和 64 位 JVM 上运行吗?

如何在 64 位 JVM 上运行我的 Java 应用程序?

如何识别我的 Java 应用程序正在使用什么 JVM?

【问题讨论】:

  • 虚拟机器的全部意义难道不是它所实现的架构无关紧要吗?
  • 如果您需要 SWT 库才能运行,则不需要。

标签: java 64-bit 32bit-64bit


【解决方案1】:

通常 64 位 jvm 会这样标识自己。

我见过的 32/64 位注意事项:

  1. 地址空间 - 如果您不希望寻址超过 1.3Gb 的内存,那么您不会看到差异
  2. 本机库 - 如果您正在加载任何 JNI 库,那么它们将需要与您的 VM 架构相匹配。例如,不要尝试从 64 位 vm 加载 32 位本机库(没有 -d32 类型的标志)

是的,相同的代码将在两个 JVM 上运行。

我认为系统属性“sun.arch.data.model”有 32/64 标志。

这里有一些有用的信息:http://www.oracle.com/technetwork/java/hotspotfaq-138619.html

【讨论】:

  • 请注意 sun.arch.data.model 是非标准的,因此非 sun JVM 实现可能不提供该系统属性。系统属性 os.arch 是标准系统属性,但您可能需要对其进行解析。检查 os.arch 是否包含字符 '64' 可能有效。
  • @jowierun "通常 64 位 jvm 会这样标识自己。"但是当我在 Solaris(安装了 32 位和 64 位 VM)上运行相同时,它总是需要 32 位 VM。
  • @Sean Reilly 但在 64 位 Sparc 机器上我可以运行 32 位 JVM。所以我认为 os.arch 不会有帮助。
  • @YoK 在 Solaris 上你需要给它 -64 选项。
  • os.arch 会告诉你操作系统是 64 位还是 32 位。这并不意味着虚拟机是。在 64 位机器上运行 32 位 VM 可能是有原因的,例如由于 JNI 库。 AFAIK 没有可移植的方法来确定当前 VM 是 32 位还是 64 位。
【解决方案2】:

在您自己的 Java 代码中,您不必针对 32 位或 64 位执行任何特殊操作。与 C 和 C++ 不同,Java 中的 int 始终为 32 位,long 始终为 64 位(在 C 和 C++ 中,这些类型的大小取决于系统)。

Java 字节码没有单独的 32 位和 64 位版本;字节码完全相同,无论您运行它的 JVM 是 32 位还是 64 位。您不必为 32 位或 64 位不同地编译 Java 源代码。在功能方面,您的 Java 应用程序运行在 32 位或 64 位 JVM 上并不重要。

jowierun 可能已经提到了一些技术差异。也可能存在性能差异;例如,Oracle 针对 Windows 的 64 位 JVM 的调整与 32 位 JVM 不同,它进行其他 JIT 优化。我最近在一个计算密集型应用程序中注意到了这一点。在 64 位 JVM 上,它的运行速度比在 32 位 JVM 上快得多。 (但这只是一个例子,不要以此证明任何程序在 64 位 JVM 上运行得更快)。

【讨论】:

  • 64 位 x86 JVM(和许多其他 64 位程序)运行速度更快的原因之一是它有更多的寄存器可以与oracle.com/technetwork/java/…一起使用
【解决方案3】:

你有这些问题。

  1. 您无需在 Java 代码中执行任何操作,它可以在 32 位和 64 位上运行。
  2. 因此您无需知道它是否是 64 位 JVM。

【讨论】:

  • @downvoter:请解释一下。无法解释的反对票对任何人都没有帮助:它们不会向公众展示答案有什么问题,也不会帮助发帖者。
  • 我认为这是因为您只回答了 20% 的问题。此外,因此之后的部分是您的假设
  • @Pacerier 如果那里有一些不正确的东西,而不仅仅是一个不完整的答案,我希望会投反对票。我觉得这很奇怪。
  • @Pacerier 如果那里有什么不正确的地方,我希望会投反对票,而不仅仅是因为答案不完整。事实上 20% 是不正确的:我已经完全回答了。这里没有5个问题:1和5本质上是一样的,我都回答了​​;我回答 2 为“否”,回答 3 为“是”,而 4 的答案是“相同的方式”,这在我的其他答案中是隐含的。那是100%。 “因此”之后的部分不是假设,而是从正确前提的逻辑推论。
【解决方案4】:

如果您计划使用 Java 本机接口 (JNI) 编写本机代码,则在编写可在 64 位和 32 位机器上运行的正确 C 代码时必须格外小心。确保在向/从 java 代码传递参数时使用正确的 Java 类型(JNI 为 java 类型提供了一组 typedef),尤其是在转换数组时。并且在测试您的本机代码时,使用不同的 JVM 在两种架构上进行测试(-m32 将在 GNU gcc 上强制使用 32 位架构)。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 2012-09-19
    • 2013-09-01
    • 2012-09-08
    • 2011-06-26
    • 2014-01-05
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多