【问题标题】:Does a 32bit process need more memory when it runs on a 64bit system?32 位进程在 64 位系统上运行时是否需要更多内存?
【发布时间】:2023-03-04 23:58:01
【问题描述】:

我有一个相当消耗内存的 Java 应用程序。 在我的带有 Windows XP Professional 的 32 位系统上,如果我给它-Xmx1280m,应用程序将运行良好。以下所有内容都会以 java.lang.OutOfMemoryError: Java heap space 异常结束。

如果我在 64 位 Windows XP Professional 上运行相同的应用程序(其他一切都完全相同),它需要 -Xms1400m 来防止 OutOfMemory 条件。

据我了解,如果我有一个 C 程序并且我将它编译为 32 位和 64 位 64 位版本将需要更多内存,因为指针更宽等等。 但是在我的 java 示例中,虚拟机 (Sun) 是相同的,并且字节码是相同的。

为什么在 64 位机器上需要更多内存?

【问题讨论】:

    标签: java windows-xp 64-bit 32-bit out-of-memory


    【解决方案1】:

    这与您已经为 C 程序列出的原因相同。 64 位系统使用大内存地址,导致它“更泄漏”(我相信这是我听说过的用来描述它的术语)。

    【讨论】:

    • “泄漏”是一个非常不准确的术语来描述这一点。不涉及内存泄漏。指针更大。
    【解决方案2】:

    可能是因为 虚拟机 实现在 32/64 位架构之间存在差异,因此它会消耗更多内存(更广泛的类型,不同的 GC)。

    字节码在将任务传递给底层系统时是无关紧要的。我不确定 Java 和内存效率是我会放在一起的两个术语:P

    【讨论】:

    • 这在 .NET 上更为明显,因为它有一个表示指针的 IntPtr 类……在 32 位模式下运行时为 4 个字节,在 64 位模式下运行时为 8 个字节。
    • 嗯,如果它在 64 位上确实有所不同,我希望它可以处理超过 2 GB,但它不能。 -Xmx1400m 是 java 在 64 位机器上接受的最大值。似乎我只得到了缺点(内存膨胀)而不是优点(更大的进程地址空间)。
    • 我想你是 Java,但我对 JVM 实现的细节并不了解。
    【解决方案3】:

    即使您的字节码是相同的,JVM 也会将其转换为机器码,因此它与 C 需要更大内存占用的原因相同。

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 2012-06-12
      • 2010-10-12
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多