在JavaFX 8中保持中间绑定不被垃圾回收的建议方法是什么? - 代码日志

在JavaFX 8中保持中间绑定不被垃圾回收的建议方法是什么?

TL; DR:GC正在吃我的活动绑定。

我有一个开发的应用程序,并使用JavaFX 2.2在Java 7上成功部署。

当我升级/转换到JavaFX 8.0(和Java 8)时,某些功能将“神秘地”停止工作 – 中间应用程序生命周期 – 没有异常或其他错误状态更改的指示。例如;按钮停止工作,自定义单元格渲染器停止应用,启用/禁用状态停止更新。

经过好几个小时的挖掘,我认为我已经将问题跟踪到了JavaFX 8中的一些变化,以及javafx.beans.WeakListener内部使用JavaFX 2.2内存泄漏的内容。基本上,似乎我创建的用于管理数据状态依赖的绑定正在收集垃圾,尽管它们控制的节点仍然是活动的。

当我使用匿名类实例化绑定时,最常见的问题就是出现。通过将绑定的引用存储为类成员,可以解决一些但不是我所有的问题,从而使GC不会收集它。我甚至有整个控制器得到GC’d,因为它们是通过FXML加载实例化的,并且从未直接引用(我现在总是在父节点的userData属性中填充对控制器的引用)。

我的问题是:

>相关的错误非确定性地出现(或至少是内存占用的功能,
>如果应该避免通过匿名类的绑定,那么在大型现有代码库中查找每个实例来改变它都是很多的工作
>即使我可以找到每一个实例,它都会非常地拼写代码

令人沮丧的是,我似乎没有在Oracle文档中找到任何“不要创建与匿名类绑定”的任何内容,或者任何其他准则,以确保可靠地使用绑定。很多代码示例在那里使用匿名类绑定。我也无法找到任何关于如何正确更新JavaFX 2.2应用程序到JavaFX 8的注释。

非常感谢任何人开发非常简单的JavaFX应用程序的建议(我已经开发了3年的JavaFX 2.x应用程序,并且Swing应用程序已经使用了15年,所以这不完全是一个n00b的问题)。

注意:我的问题类似于Clean JavaFX property listeners and bindings (memory leaks),但是我想特别和明确地知道如何使用复杂的绑定,并确保它们不会随机垃圾回收,而不需要使用引用每个实例的污染类。

WeakEventHandler被设置为允许侦听器对象的GC(如果没有被引用),并且在那时停止工作。正如你所发现的,这意味着你必须引用处理程序,只要你需要它来保持触发。无论您是否使用匿名类,此要求或多或少都独立于此;如果您使用普通类,它将以相同的方式失败。

没有可能的方式“自动”确定某个事件将来不再被触发,这本质上是“修复”此问题所需的功能要求。如果你不想要任何GC,你可以简单地将所有的匿名侦听器添加到一个存储为静态变量的列表中。如果你希望GC工作(最终你会),你将不得不通过仅在需要时保留引用来控制它,并在不再释放它们时释放它们。

http://stackoverflow.com/questions/28216348/what-is-the-recommended-approach-to-keeping-intermediate-bindings-from-being-gar

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在JavaFX 8中保持中间绑定不被垃圾回收的建议方法是什么?