【发布时间】:2016-08-31 16:01:09
【问题描述】:
我构建了一个 JavaFX(8) 3D 应用程序,它从某个文件中读取数据并将其渲染到某个场景中。
为了渲染一个对象,我使用:
graphicsContainer.getChildren().add(some3dObject);
当我注释掉这一行时,为了禁用渲染,我根本没有内存泄漏。
但是当这条线运行时,应用程序会消耗越来越多的内存。我每秒有 30 帧,每秒内存消耗增加约 50MB。
这是当然的,虽然在我使用的帧之间:
graphicsContainer.getChildren().clear();
我分配给graphicsContainer 的 3D 对象是本地的,没有保存在任何静态/全局范围内。它们仅保存为graphicsContainer 的子级,在每一帧上都会被清除。
似乎 JavaFX-3D 引擎中的某些内容并没有真正清除我的工作,尽管我每次都删除了 graphicsContainer 的子项。
知道如何让 JavaFX 3D 引擎释放过去的 3D 对象和渲染吗?
【问题讨论】:
-
您有什么实际证据表明存在内存泄漏?它最终会完全耗尽内存吗?你怎么知道垃圾收集器根本没有确定它需要回收未使用的内存(还)?
-
你是在 Linux 上运行它吗? JavaFX 在具有某些配置的 Linux 上存在一些内存泄漏问题(从技术上讲,泄漏可能是在 Mesa 中,而不是 Java,但 JavaFX 是我遇到的唯一地方)
-
@James_D,我使用 Windows 任务管理器查看 Java 进程的内存消耗如何在 30 秒的帧(900 帧,因为它是 30 fps)内逐渐从 110M 增加到 4000M。我尝试在每次调用
graphicsContainer.getChildren().clear()后手动调用垃圾收集器 - 它只会导致 CPU 使用率超过 90%,而不会影响内存消耗 -
请注意,如上所述,我目前在每一帧上都从它的子对象中清除
Group对象并分配新的子对象。也许如果我从第一帧保存 3D 对象,并且每次只根据动画更改它们的过渡,效果会更好 -
当我从同一帧保存 3D 对象并始终更改它们的属性而不是每次都创建新对象时似乎要好得多(尽管旧对象必须像我一样从我的范围内消失)不要将它们保存在任何地方)
标签: memory-leaks javafx-8 javafx-3d java-memory-leaks