JavaFX TableView WeakListChangeListener内存泄漏?

时间:2014-11-25 20:09:04

标签: java javafx tableview

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

还有一个行工厂,当该行的状态发生变化时,它会在整行上设置样式。

表中的数据将更新并在数组列表中使用,该数组列表是从可观察列表创建的表中项目的副本。一旦以各种方式操作复制列表,通过执行observableList.setAll(复制)来更新表项,我还尝试了observableList.clear(),addAll(copy)以查看它是否有任何区别。

问题是随着时间的推移,似乎存在内存泄漏。使用MAT(https://eclipse.org/mat/)泄漏嫌疑人显示TableView visibleLeafColumns数据结构似乎保存了大量未被垃圾收集的WeakListChangeListener对象。表中有6列有250行(每分钟操作一次)但运行约30分钟后,有80,000个WeakListChangeListeners注册!

查看TableCell的源代码并假设我正确读取它似乎只在创建新的TableCell时添加了visibleLeafColumns,但我认为表格单元格被TableView重用,因此不应该被创造。 (http://hg.openjdk.java.net/openjfx/2.2/master/rt/file/e71070b0e0c0/javafx-ui-controls/src/javafx/scene/control/TableCell.java

我在几年前发现了一篇类似的帖子(https://community.oracle.com/thread/2354497?tstart=0),我想知道是否有其他人遇到过类似的问题。

平台:Redhat Linux v6 Java:1.7.0 update 67

任何指针都会非常感激。

谢谢,

安迪

1 个答案:

答案 0 :(得分:0)

此问题有一个Jira错误报告RT-34970。我的同事通过定期删除所有列并将其添加回来解决了这个问题。这导致TableView整理了visibleLeafColumn对象,并且堆保持合理。

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