32位进程在64位系统上运行时需要更多的内存吗?

3
我有一个内存占用较高的Java应用程序。在我的32位Windows XP Professional系统上,如果我给它-Xmx1280m,应用程序就可以正常运行。任何小于此值的设置都会导致java.lang.OutOfMemoryError: Java heap space异常。
如果我在64位Windows XP Professional上运行相同的应用程序(其他条件完全相同),则需要-Xms1400m才能避免OutOfMemory错误。
据我理解,如果我有一个C程序,并且我将其编译为32位和64位版本,则64位版本将需要更多的内存,因为指针更宽等等。然而,在我的Java示例中,虚拟机(Sun)相同,字节码也相同。 为什么64位机器需要更多的内存?
3个回答

5
也许是因为32/64位架构之间的虚拟机实现不同,导致它消耗更多内存(更宽的类型、不同的GC)。当字节码将任务传递给底层系统时,字节码是无关紧要的。我不确定Java和内存效率是两个词汇我会放在一起的:P

1
这在.NET上更为明显,因为它有一个IntPtr类来表示指针...在32位模式下运行时为4个字节,在64位模式下为8个字节。 - Powerlord
1
啊,如果在64位上与32位不同的话,我期望它可以寻址超过2GB,但实际上它无法。在64位机器上,-Xmx1400m是Java可以接受的最大值。似乎我只得到了劣势(内存膨胀),而没有优势(更大的进程地址空间)。 - Ludwig Weinzierl
1
我猜你是在学Java,但我对JVM实现的具体细节并不是很了解。 - Aiden Bell

4

尽管您的字节码相同,但JVM会将其转换为机器代码,因此它与C语言一样需要更大的内存占用。


3

这是与C程序相同的原因。64位系统使用大内存地址,导致其“泄漏”(我认为这是我听到的用于描述它的术语)。


3
“leakier”这个词非常不准确来描述这个问题。这并不涉及任何内存泄漏。指针只是更大了而已。 - Laurence Gonsalves

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