2010-06-06 57 views
3

我正在嘗試編寫一個填字遊戲創作者。使用給定的字典txt文件和給定的模式txt文件。基本思想是使用DFS算法。當字典文件是v-e-r-y大時(約50000字),問題就開始了。然後我recive的:螺紋線程「main」中的異常java.lang.OutOfMemoryError,如何查找並修復?

異常「主要」 java.lang.OutOfMemoryError:GC開銷超過限制

我知道有我的計劃,浪費內存的一部分,但我不知道在哪裏它是,如何找到它,以及如何解決它

+0

「如何找到」被這個相關問題所覆蓋:http://stackoverflow.com/questions/2840421/whats-a-good-free-tool-for-investigating-unintentional-object-retention-in-java – meriton 2010-06-06 21:26:30

回答

3

它真的浪費內存嗎?如果你正在加載一個很大的字典,那麼你可能只是想增加JVM內存設置(JVM有一個最大的內存分配 - 取決於你的平臺,並且是可配置的)。

例如

$ java -Xmx512m .... 

會將JVM的最大內存分配增加到512m。

如果您認爲自己有內存泄漏(垃圾收集不會因參考未被釋放而無法啓動),那麼可以使用諸如YourKit的分析程序。請注意,這不是免費的,但試用版可能會幫助您解決問題。

+0

嘿,我已經試圖增加JVM內存.. 你有沒有另外的建議? – 2010-06-06 17:48:36

+0

你有沒有試過分析它? – 2010-06-06 17:54:47

+0

對於我的無知感到遺憾,什麼是剖析? – 2010-06-06 18:18:04

0

有些時候,我看到人們初始化變量在循環一樣

While(condition){ 

    String s="tttt"; 

} 

,因爲它浪費大量的內存應該避免這種情況。

+0

它不一定會浪費內存(並且您的示例絕對不會,因爲字符串文字彙集在一起​​)。它甚至可以幫助,因爲垃圾收集的年輕物體比收集舊物體便宜。 – gustafc 2010-06-06 18:35:56

+0

非常感謝..這是我不知道的東西。它真的讓我的一天。 – 2010-06-06 18:49:06

0

這是一個棘手的問題。我遇到過一次或兩次,增加堆的大小並沒有幫助。用虛擬機設置解決它 - 你甚至可能想減小堆大小(它曾經爲我工作過)。你可能也想測試不同的垃圾收集器,我已經成功使用G1 collector

關於如何避免這種錯誤的一般建議也很難(或者當我研究這個問題來解決我自己的問題時,對我來說似乎是這樣)。 High infant mortality可能是好的,因爲年輕物體比舊物體收集更便宜。

0

大字典... mmm ..是否存在直接存儲在jvm的絕對要求?

像我這樣的懶人可以將它存儲在數據庫中(甚至可能是內存 - 例如超音速),將通過列表搜索的責任轉移到數據庫,同時我的程序正在創建有趣的對稱黑白方塊組合:)

雖然只是一個想法。

2

爲了解決這個問題(在基於Linux的操作系統)做以下

1)增加內存(使這一問題不經常來)通過配置「域名。XML」在

/的glassfish /域/域1 /配置

搜索

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2)殺死了GlassFish過程以釋放在其上正在運行的端口(在我的情況下,它是8686) 開放終端(在基於Linux的操作系統)和類型 -

sudo netstat -npl | grep 8686

這將導致類似..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

下次使用

kill -9 3452殺死(在這種情況下,3452),該過程

現在嘗試啓動玻璃魚,它應該開始。

相關問題