【发布时间】:2018-07-23 08:37:47
【问题描述】:
我有一个具有SimpleXXXXProperty 属性的模型类。 Javafx GUI 元素使用绑定或更改侦听器进行更新,例如
textField.textProperty().bind(myModel.myModelStatus());
或
myModel.myModelStatus().addListener((obj,oldv.newv) -> { update here });
当模型类的实例发生变化时,我重新绑定控件并再次添加侦听器。但是,我可以通过内存使用情况看到旧模型仍然存在于内存中。
我必须怎么做才能删除对模型的所有引用以便清理它?
- 在再次绑定之前取消绑定
- 移除监听器
- 两者
当父属性更改时,是否有更自动的方法来更新嵌套属性上的绑定和侦听器?
【问题讨论】:
-
如何移除被实现为 lambda 表达式的监听器?
-
如果您只有绑定,那么如果您在其他任何地方都没有持有模型对象的任何引用,那么就不应该有任何内存泄漏。如果您使用了任何侦听器,则需要删除它们(这意味着您不能使用内联 lambda,因为无法删除它们)。
-
如果一个属性
p1绑定到另一个属性p2并且有对p1的引用,那么也有对p2的引用。如果您使用侦听器和p1的侦听器,并且它引用了对象o,只要有对p1的引用,就会有对o的引用。只要没有通过其他对象引用它们,解除绑定/绑定到不同的属性并删除侦听器应该会改变这一点并使对象可用于垃圾回收。不过,删除 lambda 表达式而不将其存储在某处应该是不可能的。 (顺便说一句,GC 可能不会立即声明对象。) -
您也可以使用
WeakInvalidationListener或WeakChangeListener,但两者都不会用于您的显式重新绑定场景。 -
我认为同样重要的是要注意,GC 总是可以选择延迟内存回收,正如@fabian 提到的那样。
标签: javafx