我正在嘗試編寫一個填字遊戲創作者。使用給定的字典txt文件和給定的模式txt文件。基本思想是使用DFS算法。當字典文件是v-e-r-y大時(約50000字),問題就開始了。然後我recive的:螺紋線程「main」中的異常java.lang.OutOfMemoryError,如何查找並修復?
異常「主要」 java.lang.OutOfMemoryError:GC開銷超過限制
我知道有我的計劃,浪費內存的一部分,但我不知道在哪裏它是,如何找到它,以及如何解決它
我正在嘗試編寫一個填字遊戲創作者。使用給定的字典txt文件和給定的模式txt文件。基本思想是使用DFS算法。當字典文件是v-e-r-y大時(約50000字),問題就開始了。然後我recive的:螺紋線程「main」中的異常java.lang.OutOfMemoryError,如何查找並修復?
異常「主要」 java.lang.OutOfMemoryError:GC開銷超過限制
我知道有我的計劃,浪費內存的一部分,但我不知道在哪裏它是,如何找到它,以及如何解決它
它真的浪費內存嗎?如果你正在加載一個很大的字典,那麼你可能只是想增加JVM內存設置(JVM有一個最大的內存分配 - 取決於你的平臺,並且是可配置的)。
例如
$ java -Xmx512m ....
會將JVM的最大內存分配增加到512m。
如果您認爲自己有內存泄漏(垃圾收集不會因參考未被釋放而無法啓動),那麼可以使用諸如YourKit的分析程序。請注意,這不是免費的,但試用版可能會幫助您解決問題。
嘿,我已經試圖增加JVM內存.. 你有沒有另外的建議? – 2010-06-06 17:48:36
你有沒有試過分析它? – 2010-06-06 17:54:47
對於我的無知感到遺憾,什麼是剖析? – 2010-06-06 18:18:04
有些時候,我看到人們初始化變量在循環一樣
While(condition){
String s="tttt";
}
,因爲它浪費大量的內存應該避免這種情況。
它不一定會浪費內存(並且您的示例絕對不會,因爲字符串文字彙集在一起)。它甚至可以幫助,因爲垃圾收集的年輕物體比收集舊物體便宜。 – gustafc 2010-06-06 18:35:56
非常感謝..這是我不知道的東西。它真的讓我的一天。 – 2010-06-06 18:49:06
這是一個棘手的問題。我遇到過一次或兩次,增加堆的大小並沒有幫助。用虛擬機設置解決它 - 你甚至可能想減小堆大小(它曾經爲我工作過)。你可能也想測試不同的垃圾收集器,我已經成功使用G1 collector。
關於如何避免這種錯誤的一般建議也很難(或者當我研究這個問題來解決我自己的問題時,對我來說似乎是這樣)。 High infant mortality可能是好的,因爲年輕物體比舊物體收集更便宜。
大字典... mmm ..是否存在直接存儲在jvm的絕對要求?
像我這樣的懶人可以將它存儲在數據庫中(甚至可能是內存 - 例如超音速),將通過列表搜索的責任轉移到數據庫,同時我的程序正在創建有趣的對稱黑白方塊組合:)
雖然只是一個想法。
爲了解決這個問題(在基於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),該過程
現在嘗試啓動玻璃魚,它應該開始。
「如何找到」被這個相關問題所覆蓋:http://stackoverflow.com/questions/2840421/whats-a-good-free-tool-for-investigating-unintentional-object-retention-in-java – meriton 2010-06-06 21:26:30