2013-04-28 19 views
1

當我跑我的hyprgraph施工中的應用,我得到這個異常Unix的交換和Java堆空間異常回避

java.lang.OutOfMemoryError: Java heap space 

我使用Ubuntu 12.04 命令free -m幾分鐘的異常之前的輸出是:

[email protected]:~$ free -m 
     total  used  free  shared buffers  cached 
Mem:   3939  2672  1266   0   80  610 
-/+ buffers/cache:  1981  1957 
Swap:   7328   65  7263 

我注意到,該交換不使用足夠 它可以利用它來避免這種異常

+1

使用-Xm開關增加java堆空間 – Satya 2013-04-28 15:02:55

回答

3

Java虛擬機會施加一些限制,您可以在啓動java命令時增加堆棧和堆的限制。

顯然,你必須通過類似

java -Xmx6g myprogram 

其中6克應該限制你堆到6吉布

Increase heap size in Java

1

可能是由於多種原因(例如堆耗盡由於的內存不足錯誤到程序中的內存泄漏,你的程序需要更多的內存運行,本地內存耗盡等)。找出OutOfMemory原因的最好方法是在JVM出去OutOfMemory時生成一個heapdump。您可以使用-XX:+ HeapDumpOnOutOfMemoryError選項來實現此目的。

一旦heapdump生成,您可以使用eclipse內存分析器來分析堆。

http://www.eclipse.org/mat/

以確定分析是否有內存泄漏或你的程序確實需要額外的內存。如果需要額外的內存,您可以使用-Xmx選項配置相同的內存。

0

默認限制是主存儲器的1/4。如果你增加你的最大值,你可以使用更多的。

你要注意:在使用交換空間了JVM的應用

  • 是一個非常糟糕的主意,因爲GC將殺死你的過程中如果你的機器。
  • 購買更多的內存可能是值得考慮的,你可以購買64 GB的300美元。

順便說一句我買了一臺PC給我8歲的兒子,他自己建造。 ;)它的成本是240英鎊,它有8 GB的內存。

+0

爲什麼swap會是個壞主意? – LtWorf 2014-03-28 10:51:09

+0

@LtWorf GC試圖訪問它至少兩次。一旦開始交換堆,GC可以強制最舊的頁面交換出來,以便拉入它需要訪問的部分,並最終將所有堆重新洗到磁盤的一部分。在Linux上,如果幸運的話,你可以殺死這個進程,而在Windows上,你經常需要關閉這個盒子來重新啓動控制。 – 2014-03-29 06:58:08

+0

所以這一切都是由於我認爲GC執行得不好。 – LtWorf 2014-04-01 11:44:43