JavaFX TableView WeakListChangeListener内存泄漏?

JavaFX TableView WeakListChangeListener内存泄漏?,java,javafx,tableview,Java,Javafx,Tableview,我有一个JavaFXTableView,它是使用bean中的属性对象填充的。所有列都有属性,但在CellFactory update()方法中,一些图形组件用于显示数据,例如带有多个子项的HBox 还有一个行工厂,当整行的状态发生变化时,该工厂为整行设置样式 表中的数据在数组列表中进行更新和重新调用,数组列表是从可观察列表创建的表中项目的副本。一旦复制列表以各种方式进行操作,表项就会通过observableList.setAll(复制)进行更新,我还尝试了observableList.clear

我有一个JavaFXTableView,它是使用bean中的属性对象填充的。所有列都有属性,但在CellFactory update()方法中,一些图形组件用于显示数据,例如带有多个子项的HBox

还有一个行工厂,当整行的状态发生变化时,该工厂为整行设置样式

表中的数据在数组列表中进行更新和重新调用,数组列表是从可观察列表创建的表中项目的副本。一旦复制列表以各种方式进行操作,表项就会通过observableList.setAll(复制)进行更新,我还尝试了observableList.clear()、addAll(复制)来查看它是否有任何不同

问题是,随着时间的推移,似乎出现了内存泄漏。使用MAT()泄漏嫌疑犯显示TableView visibleLeafColumns数据结构似乎包含大量未被垃圾收集的WeakListChangeListener对象。表中有6列,共有250行(大约每分钟操作一次),但在运行大约30分钟后,注册了80000个WeakListChangeListener

查看TableCell的源代码,假设我阅读正确,visibleLeafColumns似乎只在创建新TableCell时添加到,但我认为TableView重用了这些表格单元格,因此不应该创建它们。()

我在这里发现了几年前的一篇类似帖子(),我想知道是否有人遇到过类似的问题

平台:RedhatLinuxV6 Java:1.7.0更新67

任何指点都非常感谢

谢谢


Andy

本期有一份Jira bug报告。我的同事通过定期删除所有列并重新添加来解决此问题。这导致TableView整理visibleLeafColumn对象,堆保持可感知


谢谢Jewelsea和Tomas的建议。我们确实尝试过Java8,它没有内存问题,但性能似乎随着时间的推移而下降(12小时)。这似乎与动画有关,因此我们将在将来跳转到Java 8时对此进行适当的调查(缓存提示没有帮助)。

有。我建议使用更新的Java版本。正如@jewelsea指出的,这可能是一个bug,可能已经修复。通常,弱侦听器的问题是,如果观察到的对象从未更改,它们会导致内存泄漏。我在JavaFX绑定中创建了一个弱侦听器相关内存泄漏的示例。