2010-03-05 74 views
2

我在Java 3D中有一個包含大約3500個開關的大型場景圖,每個開關包含一個Shape3D和一個組,後者包含兩個更多的Shape3D。Java 3D內存泄漏

這樣做的原因設置是每3500個交換機必須能夠爲完全隱藏,或者有它的兩個孩子可見。

的問題,當我試圖修改該集團兩個Shape3Ds的幾何形狀在交換機發生。我曾嘗試以下:

  • 更改集團BranchGroup。當幾何體需要更改時,我將分支組分組並創建一個具有更新幾何體的新組體,以替換它。 泄漏大量內存。例如,初始內存使用量將在100 MB左右。稍後幾何尺寸的變化大約爲400 MB。

  • 使幾何形狀可編輯。當幾何需要改變時,我直接編輯它。 泄漏大量內存。與上面類似。

  • 使幾何可編輯,但通過參考。當幾何需要更改時,我用適當的GeometryUpdater調用updateData(...),然後完成它的工作。 泄漏內存。

  • 重新創建整個場景圖。當需要更改幾何圖形時,我將分離整個場景圖形,使用更新的幾何圖形重新創建它,然後附加新的場景圖形。 泄漏內存。

我不禁感到有一些基本的關於Java 3D存儲器管理我失蹤,這是常見的我所有的嘗試。

改變幾何的速度是不是一個問題,因爲它是一種罕見的occurence。但是,記憶問題很嚴重。

回答

2

它通常誤導使用,在操作系統級監視內存來推斷內存泄漏在Java虛擬機的工具。 JVM對於索賠和回收內存的效率有自己的想法。

如果你能解釋一下你是如何觀察內存泄漏,爲什麼它是一個嚴重的問題,那麼它可能會更容易回答你的問題。

  • 您如何測量內存使用情況?
  • 如果強制垃圾收集並輸出內存使用量,您是否仍然看到泄漏?
  • 內存問題是否會導致java.lang.OutOfMemoryError?

您可能也有興趣在這個問題:https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools

+0

要回答你的問題:我正在查看操作系統中java的內存使用情況,使用運行時報告並使用TPTP進行更仔細的檢查;是的,在強制 - 或者說,向VM推薦垃圾收集之後,內存使用保持大致相等;是的,如果對幾何體進行了足夠多的連續更改,則會拋出java.lang.OutOfMemoryError。 – 2010-03-05 09:48:49

+0

你有任何行爲節點嗎?如果你這樣做,這些可以堅持記憶? – richj 2010-03-05 10:30:31

+0

我還在想,如果節點被克隆爲重複或通過引用。 – richj 2010-03-05 10:35:01

1

附加到你的程序與VisualVM的(可在JDK jvisualvm二進制),並使用Profiler來得到一個想法,其中你的記憶去。