7

我在javaFX示例Ensemble.jar中发现频繁切换页面时,内存会越来越高,无法释放。这也发生在我的项目中。这是javaFX的错误吗?现在我们的测试人员总是抱怨这个问题。

有没有解决这个问题的好方法?javaFX中的“内存释放”我们可以做什么?

为了解决这个问题,我们做了什么:

  1. 当我们销毁 javaFX 页面时,将全局变量设置为 NULL。
  2. 减少 .css 文件中“重复大图”的使用。
  3. 在 Platform.runLater() 中调用 GC。(这似乎有点傻)

但是效果不是很明显,谁能帮帮我们?

4

2 回答 2

2

这不是 JavaFX 中的错误。

我猜您的内存泄漏来自对属性的侦听器的使用。

JavaFX 使用属性作为观察者模式的实现。将 ChangeListener 添加到属性时,实际上是在属性对象中添加了对侦听器的引用。如果您不调用RemoveListener 方法来删​​除此引用,那么只要属性对象本身没有被垃圾收集,您的侦听器就不会被垃圾收集。

我不知道您的代码是什么样的,但我可以做出一些假设:

  • 每次切换页面时都会实例化一个新控制器
  • 每个控制器实例化一个侦听器对象并将其添加到属性对象。
  • 切换页面时,前一个控制器会被垃圾回收,而属性对象则不会。在属性对象中,有对监听器对象的引用,因此监听器对象保留在内存中。切换页面越多,实例化不会被垃圾收集的侦听器越多,内存泄漏就越大。

如果给Properties添加Listeners,尝试调用removeListener方法,看看是否解决了问题。

问候,

西里尔

于 2015-08-20T13:21:53.180 回答
0

也许这无关紧要,也许我在说些愚蠢的话,但是这个选项帮助我减少了内存使用,并防止了“内存泄漏”(不断增加内存使用):

-XX:+UseG1GC(这是一个 VM 选项)。

于 2019-09-18T10:10:15.827 回答