【发布时间】:2014-08-14 23:14:50
【问题描述】:
我有一个 JavaFX 应用程序,当按下 X 按钮时,它会最小化到托盘。我一直在通过 VisualVM 监控应用程序的内存趋势。
奇怪的是,当应用程序打开或最小化到任务栏时,内存总是被 GC 回收到最初使用的内存。但是,当它最小化到托盘时(stage.hide()、systemTray.show()),内存会被 GC,但呈上升趋势(泄漏)。
在 VisualVM 中,Old Gen 空间不断增加,一段时间后达到最大值,应用程序将无响应,CPU 峰值达到 80%。
我注意到如果我在应用程序上双击托盘图标等stage.show(),GC 将清除一切恢复正常。但是,如果长时间放置,它将无法 GC 老一代。
堆转储显示javafx.scene.Scene#7 和javafx.scene.Node[]#2 拥有最多的保留空间。如果舞台没有隐藏,两者都不会出现。在引用下,它显示
this[] -> dirtyNodes().
this - value: javafx.scene.Node[] #2
<- dirtyNodes - class: javafx.scene.Scene, value: javafx.scene.Node[] #2
<- value - class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value:
javafx.scene.Scene #7
这是什么原因造成的,我该如何解决?
【问题讨论】:
-
我通过移除舞台上唯一的 GIF 图像,大大减少了隐藏舞台时的内存泄漏量。但是,问题仍然存在。我怀疑隐藏时更新 UI 的后台线程会导致场景/节点保存对旧值的引用。更新此类应用程序的最佳做法是什么?我的应用程序有点像一个聊天应用程序,随时有大约 50 个用户在线。
-
可能是一个 fx 错误 - 您可以考虑在 fx 问题跟踪器中报告它,最好使用一个简短的可运行示例来演示该行为
-
我同意@kleopatra,它看起来像一个产品错误,只有开发人员可以帮助你。 JavaFX 错误跟踪在这里:javafx-jira.kenai.com
-
您能否为此提供MCVE?
-
嘿,@staticvoid 你有没有找到答案?我可能在我正在开发的 JavaFX 应用程序中遇到类似的情况。
标签: java memory-leaks garbage-collection javafx javafx-8