2012-01-10 90 views
1

我嘗試啓動需要大量內存的java進程。出於某種原因,如果我爲進程指定了超過19G的RAM,它將不起作用。免費和頂級節目,我有23G的免費內存,所以我不知道爲什麼會出現這個錯誤。該系統有足夠的內存,但「無法爲對象堆預留足夠的空間」

  total  used  free  shared buffers  cached 
Mem:   24158  1047  23111   0   16  356 
-/+ buffers/cache:  673  23485 
Swap:   2204   0  2204 

開始與這些JVM選項的過程:

-XX:+UseConcMarkSweepGC -server -d64 -Xms4g -Xmx22g 

版本:

java version "1.7.0_02" 
Java(TM) SE Runtime Environment (build 1.7.0_02-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode) 

但是,如果我指定19G的XMX它的工作原理。

回答

1

Java VM爲堆和PermGen空間分配內存。難道你的配置有堆空間+ PermGen空間超過了你的空閒內存嗎?

哪個值是-XX:MaxPermSize設置爲?

+0

所以-​​XX: MaxPermSize不包含在Xmx中? – user3111525 2012-01-10 12:37:32

+0

不,它會單獨計算您的總內存消耗! '-Xms'和'-Xmx'只能控制堆的大小。有關更多詳細信息,請參閱[本文討論](http://stackoverflow.com/questions/4223809/is-java-permgen-space-part-of-the-total-vm-memory)。 – r3nj1 2012-01-10 12:39:12

+1

@frankmoss - 還有更多的東西不在堆中;線程堆棧,用於JVM映像的內存,用於內存映射文件和直接緩衝區的內存,由本地代碼分配的內存使得'malloc'調用等等。 – 2012-01-10 12:42:55

0

從Java文檔中提取:

通常情況下,對於任何平臺,你不希望使用更大的最大堆大小設置比可用物理內存的75%,這是因爲你需要留一些可用於JVM內部使用的內存空間「。

它也聽起來像你應該檢討無論是工藝的確,如果它需要佔用到內存的22GB的

0

是你所面臨的內存佈局問題,因爲做一個近似計算: 規模的過程中(如由你的Unix機器可見)=棧的燙髮根+大小的堆+大小的處理裸鼠+大小的大小

堆是相當小的(X MB) 大小的方法的(Y MB) 大小堆=你想要什麼 燙髮可能取決於不同的參數,但包裝問題(特別是與春季應用程序)

不要忘記留下足夠的內存來你的Unix機器(停止所有未使用的服務),以避免交換,不會幫助你很多在生產

HTH 傑羅姆

相關問題