2010-03-05 6 views
2

J'ai un grand graphe de scène en Java 3D constitué d'un groupe qui contient environ 3500 commutateurs, chacun contenant un Shape3D et un groupe, ce dernier contient deux autres Shape3D.Java 3D Memory Leak

La raison de cette configuration est que chacun des commutateurs 3500 doit pouvoir être complètement caché ou avoir un de ses deux enfants visibles.

Le problème se produit lorsque j'essaie de modifier la géométrie des deux Shape3D du groupe dans un commutateur. J'ai essayé ce qui suit:

  • Change Group à BranchGroup. Lorsque la géométrie doit être modifiée, je détache le BranchGroup et en crée un nouveau, avec une géométrie mise à jour, pour le remplacer. Fuites d'énormes quantités de mémoire. Par exemple, l'utilisation initiale de la mémoire sera d'environ 100 Mo. Un changement de géométrie plus tard, il est d'environ 400 Mo.

  • Rend la géométrie modifiable. Lorsque la géométrie doit être modifiée, je l'édite directement. Fuites d'énormes quantités de mémoire. Similaire à ci-dessus.

  • Rend la géométrie modifiable, mais par référence. Quand la géométrie doit être changée, j'appelle updateData (...) avec un GeometryUpdater approprié, qui fait alors son truc. Fuite de mémoire.

  • Recréez l'ensemble du graphe de scène. Lorsque la géométrie doit être modifiée, je détache le graphe de la scène entière, le recréer à partir de zéro en utilisant la géométrie mise à jour et attacher le nouveau graphe de la scène. Fuite de mémoire.

Je ne peux pas aider mais se sentir il y a quelque chose de base sur la gestion de la mémoire Java 3D que je manque et qui est commun à toutes mes tentatives.

La vitesse de modification de la géométrie n'est pas un problème, car il s'agit d'une occurrence rare. Le problème de mémoire, cependant, est sérieux.

Répondre

2

Il est généralement trompeur d'utiliser des outils qui surveillent la mémoire au niveau du système d'exploitation pour déduire les fuites de mémoire dans une machine virtuelle Java. La JVM a ses propres idées lorsqu'il est efficace de réclamer et de récupérer de la mémoire.

Si vous pouviez expliquer comment vous observez la fuite de mémoire et pourquoi il s'agit d'un problème sérieux, il pourrait être plus facile de répondre à votre question.

  • Comment mesurez-vous l'utilisation de la mémoire?
  • Si vous forcez un garbage collection et affichez l'utilisation de la mémoire, voyez-vous toujours la fuite?
  • Le problème de mémoire provoque-t-il une java.lang.OutOfMemoryError?

Vous pourriez également être intéressé par cette question: https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools

+0

Pour répondre à vos questions: Je regarde l'utilisation de la mémoire de Java dans le système d'exploitation, en le signalant en utilisant Runtime et en regardant de plus près en utilisant TPTP; oui, après avoir forcé - ou plutôt, suggéré à la machine virtuelle - une récupération de place, l'utilisation de la mémoire reste à peu près égale; et oui, si vous avez modifié suffisamment la géométrie, java.lang.OutOfMemoryError sera lancé. –

+0

Avez-vous des nœuds de comportement? Si c'est le cas, est-ce que ceux-ci pourraient garder la mémoire? – richj

+0

Je me demandais aussi si les nœuds sont clonés en double ou par référence. – richj

1

à votre programme Fixer avec visualvm (disponible en binaire jvisualvm dans le JDK), et utiliser le profileur pour avoir une idée où votre mémoire va.