2016-08-04 19 views
2

我明白,當一個對象被添加到列表,列表保存到基於回答這個問題 Is this java Object eligible for garbage collection in List如何使列表中的對象符合垃圾回收的條件?

對象的引用怎麼那麼如何做才能讓你的對象列表符合垃圾收集等等它從堆中移除而不佔用內存?

我問,因爲在JavaFX中,Vbox的getChildren方法返回包含vbox的子節點的可觀察列表。如果UI元素被刪除但不符合垃圾回收的條件,那麼這個對象是否仍然在消耗內存的堆上?

+1

只有當沒有其他項目引用它時,某個項目纔有資格使用GC。因此,如果它在列表中,它不能被GC'ed。只有當它從列表中刪除,它纔有資格 – jr593

+0

你是什麼意思的「如果一個UI元素被刪除,但仍不符合垃圾回收的條件?」發生的唯一方法是如果有其他元素的其他引用。一旦從列表中刪除它,該列表就沒有對它的引用,所以如果你沒有保存其他引用,它將有資格進行垃圾回收。 –

回答

2

從中刪除引用應該使它們成爲垃圾收集的主題(只要沒有其他對象保留引用!)。你知道,這是GC的工作原理:它保留那些活着的對象(可以從你的初始起點到達)。其他一切都是垃圾;並在GC決定收集垃圾時予以處置。並且在此需要精確:您必須瞭解這兩個不同的活動。對象X之間可能會有很長時間「變成垃圾」;和「X被收集;內存被釋放」。

可以使用WeakReferences來避免這種情況;但是當然,這需要一些代碼將這些WeakReference對象最初推入列表中。所以,如果你「擁有」這個代碼,你可以改變它。但是當然:這意味着當訪問WeakReference時,你總是必須檢查WeakReference背後的對象是否仍然存在。

+0

我很確定OP不「擁有」這個代碼:https://docs.oracle。com/javase/8/javafx/api/javafx/scene/layout/VBox.html – fabian

+0

確定OP沒有;但其他人閱讀我的答案,也許可以。 – GhostCat

+0

@James_D明白了;更新了我的答案。謝謝。 – GhostCat

0

如果你不能從列表中刪除對象,我可以考慮處理這個問題的唯一方法就是將你的對象包裝成一個WeakReference

+0

由於列表的類型參數是「節點」而不是「WeakReference 」,因此不適用於「VBox」的子節點。 – fabian

1

如何那你怎麼使對象在列表符合垃圾收集 以便它從堆中取出,不佔用內存 ?

假定那些對象僅通過該列表中的參考,如果UI元素被刪除,但不符合垃圾收集只需使用clear方法

, 將這個對象仍然是對堆耗費內存?

只要一個對象被至少一個本身不適合垃圾收集的對象所引用,該對象本身就不符合垃圾收集的條件,因此它不會被GC收集它會留在堆中。