如何使列表中的对象符合垃圾收集条件?

How to make object in List eligible for garbage collection?

我知道当一个对象被添加到一个列表时,该列表会根据这个问题的答案保留对该对象的引用 Is this java Object eligible for garbage collection in List

那么如何使List中的对象符合垃圾回收条件,使其从堆中移除而不占用内存?

我问是因为在 JavaFX 中,Vbox 的 getChildren 方法 returns 包含 vbox 的子节点的可观察列表。如果一个 UI 元素被移除但不符合垃圾回收条件,这个对象是否仍然在堆上消耗内存?

如果您无法从列表中删除对象,我能想到的唯一处理方法是将您的对象包装到 WeakReference.

从中删除引用应该使它们成为垃圾收集的对象(只要没有其他对象保留引用!)。

您知道,这就是 GC 的工作原理:它保留那些存活的对象(可以从您的初始起点到达)。其他一切都是垃圾;并在 GC 决定收集该垃圾后进行处置。在此准确地说:您必须了解这是两项 不同的 活动。对象 X "turns into garbage" 之间可能有很长的时间;和 "X gets collected; and memory is freed up".

可以使用WeakReferences来避免这种情况;但当然,这需要一些代码将此类 WeakReference 对象最初推入列表。所以,如果你 "own" 这个代码,你可以改变它。但是当然:这意味着在访问 WeakReference 时,你总是必须检查 WeakReference 背后的对象是否仍然存在。

How then how do you make the object in the List eligible for garbage collection so that it's removed from the heap and not taking up memory?

假设那些对象只被这个List引用,只需使用clear方法

If a UI element is removed but not eligible for garbage collection, will this object still be on the heap consuming memory?

只要一个对象被至少一个本身不符合垃圾收集条件的对象硬引用,该对象本身就不符合垃圾收集条件,因此它不会被 GC 收集然后将保留在堆中。