gpt4 book ai didi

隐藏阶段时的JavaFX 8内存泄漏

转载 作者:IT老高 更新时间:2023-10-28 20:52:15 28 4
gpt4 key购买 nike

我有一个 JavaFX 应用程序,当按下 X 按钮时,它会最小化到托盘。我一直在通过 VisualVM 监控应用程序的内存趋势。

奇怪的是,当应用程序打开或最小化到任务栏时,内存总是被 GC 回收到最初使用的内存。但是,当它被最小化到托盘时(stage.hide(), systemTray.show()),内存会被 GC,但呈上升趋势(泄漏)。

在 VisualVM 中,Old Gen 空间不断增加,一段时间后达到最大值,应用程序将无响应,CPU 峰值达到 80%。

我注意到如果我在应用程序上通过双击托盘图标等stage.show(),GC 将清除一切恢复正常。但是,如果长时间放置,它将无法 GC 老一代。

堆转储显示 javafx.scene.Scene#7javafx.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

这是什么原因造成的,我该如何解决?

最佳答案

我从来没有找到并回答过这个问题。相反,我会将隐藏的节点设为空,然后将其恢复到 View 中。对于密集的动态节点/多个节点,我创建了一个 HashMap 来将它们存储在内存中。

这已经成为我在 javafx8 中处理所有图形并从 HashMap 中重新分配隐藏和查看的习惯。在现代台式机上,额外的内存和 CPU 使用量可以忽略不计。使用这种方法,我在 win8/10 上隐藏时运行了 0 个 cpu 使用应用程序和低内存应用程序 (~100m)。

关于隐藏阶段时的JavaFX 8内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390918/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com