据我所知,当一个对象被添加到List时,List会根据这个问题的答案保留对该对象的引用 Is this java Object eligible for garbage collection in List
那么如何使List中的对象符合垃圾回收条件,以便从堆中删除它而不占用内存?
我问,因为在JavaFX中,Vboxs getChildren方法返回包含vbox子节点的可观察列表。如果删除了一个UI元素但不符合垃圾回收的条件,那么这个对象是否仍然在堆消耗内存上?
答案 0 :(得分:2)
从中删除引用应该使它们成为垃圾收集的主题(只要没有其他对象保留引用!)。
你知道,这就是GC的工作原理:保持那些活着的对象(可以从你的初始起点到达)。其他一切都是垃圾;一旦GC决定收集垃圾,可以处置。而且在这里要确切:您必须了解这些是两个不同的活动。对象X“变成垃圾”之间可能需要很长时间;并且“X被收集;内存被释放”。
可以使用WeakReferences来避免这种情况;但是,当然,这需要一些代码将最初将这样的WeakReference对象推送到列表中。所以,如果你“拥有”这段代码,你可以改变它。但当然:这意味着在访问WeakReference时,您总是必须检查WeakReference后面的对象是否仍然存在。
答案 1 :(得分:1)
那么如何使List中的对象有资格获得垃圾 收集,以便它从堆中删除而不占用 存储器?
假设这些对象仅由此List引用,只需使用clear方法
即可如果删除了UI元素但不符合垃圾回收条件, 这个对象还会在堆消耗内存吗?
只要一个对象被至少一个本身不符合垃圾收集条件的对象硬引用,该对象本身就不具备垃圾收集的条件,因此它不会被GC收集它然后将留在堆中。
答案 2 :(得分:0)
如果你无法从List中删除对象,我可以考虑处理这个问题的唯一方法就是将你的对象包装成WeakReference
。