2012-01-17 25 views
2

對於一個學校項目,我必須編寫不同類型的算法。問題是,我有一個工作算法。但我跑了幾次,一段時間後,它給了我下面的錯誤:如何解決OutOfMemoryError?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我知道是什麼錯誤意味着,但有可能讓Java的搜索運行期間空的空間?我知道它使用了很多未被使用的空間。它在應用程序運行期間將很多對象設置爲null,並創建了許多新對象,因爲它會耗盡內存。

所以具體:是否可以讓JVM釋放一些設置爲空的空間?或者在程序運行的時候釋放一些空間?我知道我可以將JVM設置爲更多空間,但遲早我會遇到同樣的問題。

如果您需要我的IDE(如果它是IDE特定的),那麼它就是Eclipse。

+0

可能的重複[如何處理「java.lang.OutOfMemoryError:Java堆空間」錯誤(64MB堆大小)](http://stackoverflow.com/questions/37335/how-to-deal-with- java-lang-outofmemoryerror-java-heap-space-error-64mb-heap) – 2012-01-17 23:12:40

+2

除非你的內存很少,否則很有可能你做錯了某些事情......真的不應該面臨大多數學校項目的內存問題 – 2012-01-17 23:12:45

+0

http://stackoverflow.com/a/5121287/20394特別討論如何在Eclipse下運行時增加內存量,本文的其餘部分討論診斷和修復內存問題的策略。 – 2012-01-17 23:13:41

回答

2

請谷歌'垃圾回收'。 Java總是希望從你不使用的對象中重用空間。如果內存不足,則需要使用-Xmx來配置更多內存,或者必須修復代碼以保留更少的對象。您可能會發現像jvisualvm這樣的分析器可以幫助您查找浪費的內存使用情況。

0

我會使用內存分析器來確定內存在哪裏使用。設置爲null很少有幫助。在獲得OOME之前,GC將始終運行並釋放盡可能多的空間。

0

問:「是否可以讓JVM釋放一些設置爲空的空間?或者在程序運行的時候釋放一些空間?」

答:是的,使用System.gc()的電話會這樣做,但這不會解決您的問題,因爲系統會不時自動執行此操作。您需要找到使用所有內存的對象並將其修復到您的代碼中。可能是一個永遠不會被清除並且只能添加到的列表。

我實際上在執行需要大量數據結構的特別複雜的算法時遇到了這個問題。我不得不在這個網站上發佈一個問題。事實證明,我必須完全使用完全不同類型的對象以避免內存錯誤。

這是question

+0

謝謝,這將是一個非常有用的答案。我可以在循環中使用暫停,讓Java收集它的carbage並檢查它是否再次運行。 – Nando 2012-01-18 00:01:55

1

如果您使用的是Oracle/Sun JVM,我建議您下載Visual VM 1.3.3,安裝全部插件,然後啓動它。它會告訴你每一代堆,線程,CPU,對象等等發生了什麼。它可以告訴你哪個類佔用了最多的堆空間。

如果您有數據,您將很快弄清楚。

0

GC會自動回收'未使用'的內存,所以是的,可以在運行時釋放一些空間,但瞭解什麼是可能被回收的是至關重要的。 如果對象本身不可訪問,基本上可以回收對象的空間(垃圾收集) - 沒有對它的引用。當你說'將空格設置爲空'時,通過將對象設置爲空,你很可能只刪除的一個鏈接(引用)。這將允許以回收這是唯一的鏈接(引用)對象只有

Object First= new Object(); //first object 
Object Second= new Object(); //second object 
Object SecondPrim=Second;  //second reference to second object 

First=null; 
// First memory will be reclaimed (sooner or later) 
Second=null; 
// there is still a reference to second object via SecondPrim 
// second object will not be reclaimed 

希望這有助於。至於檢查到底發生了什麼,我會第二個建議來分析你的程序。