2012-12-17 55 views
5

我從Windows 7(32位)切換到Windows 7(64位),因爲我添加了4 GB的RAM到我的2 GB。 現在,當我運行Eclipse Juno EE。在Windows任務管理器中,我看到進程javaw.exe正在吃〜380 Mb RAM,之前我沒有看到過,當時我正在使用32位操作系統。 我甚至沒有嘗試吃任何項目。 我寫了這個代碼:在Windows 64中javaw.exe進程是否消耗更多內存?

public static void main(String[] args) { 
    Runtime runtime = Runtime.getRuntime(); 
    System.out.println(runtime.maxMemory()); 
} 

它表明了我的JVM is allocated 1 338 507 264 bytes

這意味着當我運行項目時,這個過程可能會消耗高達1.3 Gb的RAM?!

我將來會有什麼問題嗎?

+0

在一臺6GB的機器上,380MB無需擔心。畢竟,沒有必要讓RAM閒置。 –

回答

6

64位版本將使用-server JVM,它具有更高的默認最大堆大小。 Windows 32位版本默認使用-client JVM,默認情況下它使用的資源較少,因爲它設計爲在較小的機器上運行,所以對於長時間運行的程序,結果往往較慢(客戶機JVM的短期運行速度更快像是Applet程序)

如果您設置的最大堆大小,如果你有一個最新版本的Java 6或Java 7的

+0

與op的問題沒有直接關係 - 我以爲我曾經在某處讀過同一個程序使用64位JVM的更多內存(我認爲它約爲50%左右)... – assylias

+1

Java 5和早期的Java 6未使用CompressedOops(32位參考),導致內存消耗增加約50%。正是由於這個原因,32 GB不是一個好的堆大小(因爲你丟失了Compressed Oops),你需要增加到48 GB才能獲得更多可用內存。仍有增長,但我懷疑它接近10%,而不是你可能會注意到的。 –

+0

如何設置堆大小? –

2

Runtime.maxMemory()他們應該使用大約相同數量的內存:

返回最大值 Java虛擬機的內存量wi會嘗試使用。

這是一個上限。這並不意味着JVM會預先分配這部分內存。隨着您創建對象並將它們放在周圍,您的進程的內存使用量將會增加,直到您可以配置的最大堆大小。

在Windows任務管理器我看到這​​個過程的javaw.exe是吃〜380 MB RAM

有很多方面的內存使用情況:有地址空間,虛擬內存,物理內存等。根據在任務管理器中查看哪一列,您在那裏看到的號碼可能具有許多不同含義之一。

我swiched從Windows 7(32位)到Windows 7(64位)

一般來說,這是事實,64位代碼需要比等效的32位代碼更多的內存。一方面,指針更寬,因此佔用更多空間。這適用於JVM,就像它對任何其他進程一樣。但是,JVM會採取一些措施來降低影響。其中一項措施是CompressedOops

+0

我不知道女巫專欄我在尋找,因爲我來自烏克蘭,我有俄語版本的Windows。從字面上看,它被翻譯爲「記憶」。 –