关于JavaFX中内存泄露问题

最近参与了一个JavaFX的项目,负责其中的性能测试等工作,作为一个“用户”在测试的过程中,发现其中有很严重的稳定性问题。主要表现为:操作一段时间后,VisualVM监测占用内存持续攀升,最终界面卡死,出现内存溢出异常。


由于项目中使用了JMS,一开始猜测是它的原因导致,经过排查发现与JMS并无关系。中文资料太少,没办法只能借助谷歌,在javafx官方找到了相关回答:


引起JavaFX内存溢出的原因通常为:监听没有关闭。

一般创建监听、给组件添加监听事件之后,经常会忘记移除监听(removeLinistener),而不移除监听的后果就是Java虚拟机不自动回收这部分垃圾。


后来在看了API之后,发现在Interface ObservableValue<T>的addListener方法中有相关描述:

The ObservableValue stores a strong reference to the listener which will prevent the listener from being garbage collected and may result in a memory leak. It is recommended to either unregister a listener by calling removeListener after use or to use an instance of WeakChangeListener avoid this situation.它是一个强引用的Listener,有可能会引起内存泄露,推荐的解决办法是使用完之后调用removeListener,或者使用WeakChangeListener这个弱引用的监听。


找到了问题的原因之后,配合MAT调查了一下,果然在有些控件的监听上存在内存泄露,使垃圾越堆越多,最终导致内存不足而卡死。(但是由于时间问题,相关开发人员还没有着手修正,是否存在其他问题还暂时不清楚)


资料还表示,组件绑定也会引起内存泄露,也许也是原因之一。


参考资料:

官方API:http://docs.oracle.com/javafx/2/api/javafx/beans/value/ObservableValue.html

官方讨论区:https://forums.oracle.com/thread/2502830

内存分析工具MAT:http://www.eclipse.org/mat/

你可能感兴趣的:(关于JavaFX中内存泄露问题)