2

Java 3D には、約 3500 個のスイッチを含むグループから構成される大きなシーン グラフがあり、それぞれに Shape3D とグループが含まれており、後者にはさらに 2 つの Shape3D が含まれています。

このセットアップの理由は、各 3500 スイッチを完全に非表示にするか、2 つの子のいずれかを表示できるようにする必要があるためです。

この問題は、スイッチのグループにある 2 つの 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 に答える