我在Java 3D中有一个大型场景图,它由一个包含大约3500个开关的组组成,每个开关包含一个Shape3D和一个Group,后者包含另外两个Shape3D。
这种设置的原因是3500个开关中的每一个都必须能够完全隐藏,或者两个孩子中的任何一个都可见。
当我尝试修改Switch中组中两个Shape3D的几何图形时,会出现问题。我尝试了以下方法:
将组更改为BranchGroup。当需要更改几何体时,我将分离BranchGroup并创建一个具有更新几何体的新组,以替换它。 泄漏大量内存。例如,初始内存使用量约为100 MB。稍后几何变化大约为400 MB。
使Geometry可编辑。当需要更改几何体时,我直接编辑它。 泄漏大量内存。与上述类似。
使Geometry可编辑,但需要参考。当需要更改几何体时,我使用适当的GeometryUpdater调用updateData(...),然后再执行它的操作。 泄漏记忆。
重新创建整个场景图。当需要更改几何体时,我会分离整个场景图,使用更新的几何体从头开始重新创建它,并附加新的场景图。 泄漏记忆。
我不禁觉得Java 3D内存管理有一些基本的东西我不知道,这对我所有的尝试都很常见。
改变几何形状的速度不是问题,因为它是一种罕见的发生。然而,记忆问题是严重的。
答案 0 :(得分:2)
使用监视操作系统级别内存的工具来推断Java虚拟机中的内存泄漏通常会产生误导。 JVM对于声明和回收内存的有效性有自己的想法。
如果你能解释一下如何观察内存泄漏以及为什么这是一个严重的问题,那么回答你的问题可能更容易。
您可能也对此问题感兴趣:https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools
答案 1 :(得分:1)
使用visualvm附加到您的程序(在JDK中以jvisualvm二进制文件的形式提供),并使用分析器来了解您的内存。