2

我有一个 Java 3D 中的大型场景图,由一个包含大约 3500 个开关的组组成,每个开关包含一个 Shape3D 和一个组,后者包含另外两个 Shape3D。

这种设置的原因是 3500 交换机中的每一个都必须能够完全隐藏或使其两个子节点中的任何一个可见。

当我尝试在 Switch 中修改组中的两个 Shape3D 的几何图形时,就会出现问题。我尝试了以下方法:

  • 将组更改为 BranchGroup。当需要更改几何图形时,我会分离 BranchGroup 并创建一个新的,并使用更新的几何图形来替换它。泄漏大量内存。例如,初始内存使用量约为 100 MB。后来几何形状发生变化,大约为 400 MB。

  • 使几何图形可编辑。当需要更改几何图形时,我直接对其进行编辑。泄漏大量内存。与上面类似。

  • 使几何图形可编辑,但通过引用。当需要更改几何图形时,我使用适当的 GeometryUpdater 调用 updateData(...),然后它会执行它的操作。泄漏内存。

  • 重新创建整个场景图。当需要更改几何图形时,我会分离整个场景图,使用更新的几何图形从头开始重新创建它,然后附加新的场景图。泄漏内存。

我不禁觉得我缺少一些关于 Java 3D 内存管理的基本知识,而这对我的所有尝试都是常见的。

更改几何形状的速度不是问题,因为它很少发生。但是,内存问题很严重。

4

2 回答 2

2

使用在操作系统级别监视内存的工具来推断 Java 虚拟机中的内存泄漏通常会产生误导。JVM 对何时有效地声明和回收内存有自己的想法。

如果您可以解释您是如何观察内存泄漏的以及为什么这是一个严重的问题,那么回答您的问题可能会更容易。

  • 您如何测量内存使用情况?
  • 如果您强制进行垃圾收集并输出内存使用情况,您还会看到泄漏吗?
  • 内存问题会导致 java.lang.OutOfMemoryError 吗?

您可能也对这个问题感兴趣:https ://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools

于 2010-03-05T09:40:07.623 回答
1

使用 visualvm(在 JDK 中以 jvisualvm 二进制文件的形式提供)附加到您的程序,并使用分析器了解您的内存去向。

于 2010-03-05T09:47:22.967 回答