2014-04-01 24 views
0

我正在寫一個解析器,加載相當大的文件400 + MB並解析他們在大約32MB塊,然後將解析的數據保存到磁盤。我通過使用帶有同步列表的線程保存數據,線程定期檢查列表並保存那裏的任何內容。然後我從列表中刪除該元素。但是,VM內存使用量繼續增長。Java中的內存管理,加載大文件,如何取消分配對象?

當Java虛擬機虛擬機的內存大小非常大時,速度非常快,但在達到上限時速度明顯變慢。我可以在300 MB的內存中加載一個400 MB的文件,但這非常慢。

爲什麼即使對象不再使用,它​​們仍然存在於內存中,但絕對可以被垃圾收集器釋放(這非常緩慢)。

如何防止堆變得龐大?

+0

爲什麼不加載32mb大塊如果這是你想要做的? JVM決定何時執行GC。您正在使用的GC算法可能會有所不同,但我想它會很小。 – kosa

+1

您或者未能釋放引用,或者堆實際上是垃圾回收。你必須確保的一件事是你的物品不會被提升到老一代。 –

+0

基督很明顯,我沒有發佈引用,我認爲殺死線程就足夠了。我只用了幾周的Java編程。 – Rollo

回答

1

是的,你可以這樣做:

System.gc(); 

,並打電話給垃圾收集明確地。你可以做一個簡單的操作:

var = null; 

並且您將釋放分配給此var的內存。 我希望這個幫助。

+0

這不太可能解決問題。 – assylias

+0

@assylias是正確的。 'System.gc()'可以請求不指定。 –

+1

這實際上是我的問題我有很多大數組被傳遞,即使在線程死後,它仍然在內存中持續存在,因爲我沒有清空它們。 – Rollo