JavaFX内存释放,JavaFX有bug吗?

8
我发现在JavaFX示例Ensemble.jar中频繁切换页面时,内存会越来越高并且无法释放。这也发生在我的项目中。这是JavaFX的一个bug吗?现在我们的测试人员经常抱怨这个问题。
有没有一些好的方法来解决这个问题?在JavaFX中,我们可以做些什么来“释放内存”?
为了解决这个问题,我们已经做了以下工作:
  1. 当我们销毁JavaFX页面时,将全局变量设置为NULL。
  2. 减少.css文件中“重复大图像”的使用。
  3. 在Platform.runLater()中调用GC。(这似乎有点傻)
但效果不是很明显,谁能帮助我们?

使用分析器来追踪任何内存泄漏。我推荐JProfiler - 它在过去的许多次中帮助了我很多。除此之外,您还可以搜索“Java内存泄漏”以获取其他资源。 - jewelsea
谢谢。JProfile 很有用。 - Keon Wang
1个回答

3

这不是JavaFX的错误。 我猜你的内存泄漏来自于在Properties上使用监听器。 JavaFX使用Properties作为Observer Pattern的实现。当你向属性添加ChangeListener时,实际上是在属性对象中添加了对你的监听器的引用。如果你不调用RemoveListener方法来删除此引用,只要属性对象本身没有被垃圾回收,你的监听器就不会被垃圾回收。 我不知道你的代码长什么样,但可以做出一些假设:
  • 每次切换页面都会实例化一个新的控制器
  • 每个控制器都会实例化一个监听器对象并将其添加到属性对象中。
  • 当切换页面时,以前的控制器被垃圾回收,而属性对象没有被垃圾回收。在属性对象中,有一个对Listener对象的引用,因此Listener对象仍然留在内存中。你切换页面的次数越多,你实例化的监听器就越多,不会被垃圾回收,你的内存泄漏就越大。
如果你向Properties添加Listeners,请尝试调用removeListener方法,看看是否解决了问题。 祝好, Cyril

嗨,我遇到了与@Keon所述相同的问题。我尝试了几乎所有不同类型的解决方案,例如删除静态数据、变量,我还增加了Vm大小。还检查了弱引用,但我无法获得适当的执行方法。我还减少了不必要的后台线程。我也看了你的解决方案,但在我的2-3页中,只有很少的点击监听器会增加内存使用量吗? - Zeeshan Saiyed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接