我正在寫一個解析器,加載相當大的文件400 + MB並解析他們在大約32MB塊,然後將解析的數據保存到磁盤。我通過使用帶有同步列表的線程保存數據,線程定期檢查列表並保存那裏的任何內容。然後我從列表中刪除該元素。但是,VM內存使用量繼續增長。Java中的內存管理,加載大文件,如何取消分配對象?
當Java虛擬機虛擬機的內存大小非常大時,速度非常快,但在達到上限時速度明顯變慢。我可以在300 MB的內存中加載一個400 MB的文件,但這非常慢。
爲什麼即使對象不再使用,它們仍然存在於內存中,但絕對可以被垃圾收集器釋放(這非常緩慢)。
如何防止堆變得龐大?
爲什麼不加載32mb大塊如果這是你想要做的? JVM決定何時執行GC。您正在使用的GC算法可能會有所不同,但我想它會很小。 – kosa
您或者未能釋放引用,或者堆實際上是垃圾回收。你必須確保的一件事是你的物品不會被提升到老一代。 –
基督很明顯,我沒有發佈引用,我認爲殺死線程就足夠了。我只用了幾周的Java編程。 – Rollo