【问题标题】:How to make object in List eligible for garbage collection?如何使 List 中的对象有资格进行垃圾收集?
【发布时间】:2016-12-10 10:41:04
【问题描述】:

我了解,当将对象添加到列表时,列表会根据此问题的回答保留对该对象的引用 Is this java Object eligible for garbage collection in List

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

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

【问题讨论】:

  • 一个项目只有在没有其他项目引用它时才有资格获得 GC。因此,如果它在 List 中,则无法进行 GC。只有从列表中删除它才有资格
  • “如果 UI 元素被移除但仍不符合垃圾回收条件”是什么意思?发生这种情况的唯一方法是,如果某处有其他对该元素的引用。一旦你从列表中删除它,列表就没有对它的引用,所以如果你没有保留对它的其他引用,它将有资格进行垃圾回收。

标签: java javafx collections garbage-collection observablelist


【解决方案1】:

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

您知道,这就是 GC 工作的全部理念:它保留那些活着的对象(可以从您的初始起点到达)。其他的都是垃圾;并在 GC 决定收集该垃圾后进行处理。在这里要准确地说:您必须了解这是两个不同的活动。对象 X “变成垃圾”之间可能有很长的时间;和“X 被收集;内存被释放”。

可以使用WeakReferences 来避免这种情况;但当然,这需要一些代码最初将此类 WeakReference 对象推送到列表中。所以,如果你“拥有”这段代码,你可以改变它。但是当然:这意味着在访问 WeakReference 时,您必须始终检查 WeakReference 背后的对象是否仍然存在。

【讨论】:

【解决方案2】:

然后如何使列表中的对象符合垃圾条件 收集,以便从堆中删除而不占用 内存?

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

如果 UI 元素被移除但不符合垃圾回收条件, 这个对象还会在堆上消耗内存吗?

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不能用于VBox 的子级,因为列表的类型参数是Node 而不是WeakReference<Node>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2019-09-04
    相关资源
    最近更新 更多