开发者

Java 3D Memory Leak

开发者 https://www.devze.com 2022-12-21 20:42 出处:网络
I have a large scene graph in Java 3D consisting out of a Group which contains around 3500 Switches, each containing a Shape3D and a Group, the latter contains two more Shape3Ds.

I have a large scene graph in Java 3D consisting out of a Group which contains around 3500 Switches, each containing a Shape3D and a Group, the latter contains two more Shape3Ds.

The reason for this setup is that each of the 3500 Switches must be able to be either completely hidden or have either of its two children visible.

The problem occurs when I try to modify the geometry开发者_开发技巧 of the two Shape3Ds in the Group in a Switch. I have attempted the following:

  • Change Group to BranchGroup. When the geometry needs to be changed I detach the BranchGroup and create a new one, with updated geometry, to replace it. Leaks huge amounts of memory. For example, the initial memory usage will be around 100 MB. A change in geometry later it is around 400 MB.

  • Make the Geometry editable. When the geometry needs to be changed I edit it directly. Leaks huge amounts of memory. Similar to above.

  • Make the Geometry editable, but by reference. When the geometry needs to be changed I call updateData(...) with an appropriate GeometryUpdater, which then does its thing. Leaks memory.

  • Recreate the entire scene graph. When the geometry needs to be changed, I detach the entire scene graph, recreate it from scratch using the updated geometry, and attach the new scene graph. Leaks memory.

I can't help but feel there is something basic about Java 3D memory management that I'm missing and that is common to all my attempts.

The speed of changing the geometry is not an issue, as it is a rare occurence. The memory problem, however, is serious.


It's usually misleading to use tools that monitor memory at the operating system level to deduce memory leaks in a Java Virtual Machine. The JVM has its own ideas on when it is efficient to claim and reclaim memory.

If you could explain how you are observing the memory leak and why it is a serious problem then it might be easier to answer your question.

  • How are you measuring memory usage?
  • If you force a garbage collection and output the memory usage do you still see the leak?
  • Does the memory problem cause a java.lang.OutOfMemoryError ?

You might also be interested in this question: https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools


Attach to your program with visualvm (available as jvisualvm binary in the JDK), and use the profiler to get an idea where your memory goes.

0

精彩评论

暂无评论...
验证码 换一张
取 消