簡體   English   中英

為什么ArrayList.clear()方法不釋放內存?

[英]Why ArrayList.clear() method doesn't free memory?

我正在研究ArrayList.clear()並發現它不會釋放內存,而是使該列表為空。 當您可以手動告訴編譯器不再需要該特定的ArrayList時,為什么還要等待GC來釋放該內存(它可以通過清除方法本身完成)。

為什么要不必要地使GC頭痛呢。

我知道System.gc()影響應用程序性能,因為它為整個應用程序運行垃圾回收。

如果我的服務器內存有限且列表太大,有什么辦法可以收集這個特定的ArrayList垃圾,而不是等待GC救援。

編輯:-出現此問題是因為我已經初始化ArrayList(500000)並假設由於一些預初始化的變量而導致我的對象大小約為1000bytes,但是由於形成第一個對象本身的某些異常,我需要從該函數中返回並釋放我分配給該ArrayList的內存。我希望我的應用程序消耗的內存盡可能少。 GC對我來說是不得已的選擇。

您為什么要等待GC來釋放該內存(本來可以用清除方法本身完成)

不,不能。 ArrayList確實不再引用對象,但是clear()方法不知道它們是否仍在其他位置被引用,因此這就是垃圾收集器的工作。

您為什么要等待GC來釋放該內存(本來可以用清除方法本身完成)

上面的句子中有一個很大的誤解:Java中的GC釋放了所有內存,沒有辦法手動釋放堆上對象占用的內存。

但是要回答為什么clear()會使所有元素都為空而不是僅僅丟棄舊的支持數組的問題,簡單的答案是“因為它是用這種方式編寫的”。

稍長一點的答案是,您通常在使用新元素填充列表之前使用clear() ,因此扔掉舊數組並分配一個新數組(然后可能需要重新分配幾次,以達到與數組相同的大小。早期的支持陣列)被認為太浪費了。

另一方面,如果您想ArrayList刪除ArrayList ,則無需在其上調用clear() ,只需將對列表本身的所有引用都作空即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM