2012-05-27 43 views
0

我正在創建一個java程序,其中一些數據被添加到數組列表中。如何立即從內存中刪除剛剛從數組列表中刪除的值

一些處理是在一個循環中,只是一個迭代結束前我加入一個新的節點列表中的循環中,執行操作使用節點,然後刪除該節點使用arraylist.remove()的循環。我也在運行System.gc();就在循環迭代結束之前。

但是,當我使用內存轉儲時,我發現arraylist仍然保存着我在不同循環迭代中使用的所有值......如何從內存中清除所有這些值?我想在循環迭代結束之前這樣做,以便數組列表的大小永遠不會增長?

+3

爲什麼你關心?使用像Java這樣的內存管理語言應該隱藏你的這些細節。 –

+0

我正在使用的程序將被用於提取數百萬條記錄,並且在內存耗盡的速度下,我無法在程序的一次(甚至幾次)運行中獲取所有數據,沒有使用我的機器的整個內存... – Arvind

+0

爲什麼你不使用數組,如果你想要一個固定的大小? – Robert

回答

0

的Java有是有原因的垃圾收集器,以及原因是程序員不必考慮從內存中刪除對象。只有你可以做的事情(我不推薦它)是通過System.gc()方法強制啓動垃圾收集器。但請記住這樣做兩次,因爲它第一次只會通過調用finalize()方法來準備要刪除的對象。

1

如果你把一個「活」對象的內存轉儲,它將被刪除。

刪除對象的成本是比較高的,所以它通常最好在Java中,只有當你需要刪除對象的性能(當JVM做它)

+0

有沒有辦法從內存中刪除對象,在一個java命令的幫助下?這就是我正在尋找的... – Arvind

+0

我認爲你可以調用垃圾回收器/ –

+1

你必須問自己爲什麼你想要。問題是,99.9%的時間你不在乎。這就是您使用託管內存的原因。順便說一句:我使用的大部分內存都沒有管理,但它非常少見,你需要這樣做。 –

1

你的意思是釋放由ArrayList佔用的部分內存,而不是釋放以前存儲在ArrayList中的對象?如果是這樣,你可以通過調用ArrayList.trimToSize()來完成 - 它會將ArrayList中的所有值複製到一個新的(內部)數組中,並允許舊的(內部)數組被垃圾收集。 (因爲這涉及複製陣列中的所有值,所以當然只有當它會產生很大差異時才能完成。)