2009-07-01 22 views
3

我有一個內存飢餓的java應用程序。 在我使用Windows XP Professional的32位系統上,應用程序運行良好,如果我給它-Xmx1280m。以下所有內容都將以java.lang.OutOfMemoryError: Java heap space例外結束。32位進程在64位系統上運行時是否需要更多內存?

如果我在64位Windows XP Professional上運行相同的應用程序(其他一切完全相同),則需要使用-Xms1400m來防止OutOfMemory條件。

據我的理解,如果我有一個C程序,並且我將它編譯爲32位和64位,那麼64位版本將需要更多的內存,因爲指針更寬等等。 然而,在我的Java例子中,虛擬機(Sun)是相同的,字節碼是相同的。

爲什麼64位機器需要更多內存?

回答

5

可能是因爲虛擬機實現方式在32/64位體系結構之間存在差異,使得它消耗更多的內存(更寬的類型,不同的GC)。

字節碼在將任務傳遞到底層系統時無關緊要。我不知道Java和內存效率是兩個術語,我將無論如何放在一起:P

+1

這在.NET上更爲明顯,因爲它有一個IntPtr類,它代表一個指針...當在32位模式下運行時爲4個字節,在64位模式下爲8個字節。 – Powerlord 2009-07-01 20:20:21

+1

嗯,如果它確實不同於64位,我預計它可以解決超過2 GB,但它不能。 -Xmx1400m是java在64位機器上接受的最大值。似乎我只得到了缺點(內存膨脹),但沒有優勢(更大的進程地址空間)。 – 2009-07-01 20:37:21

4

即使您的字節碼相同,JVM也會將其轉換爲機器代碼,因此它與C需要更大的內存佔用量的原因完全相同。

3

這與您已經列出的C程序的原因是一樣的。 64位系統使用大內存地址,導致它「泄漏」(我相信這是我聽過的術語來描述它)。

相關問題