Hallo,
Ich bin im Moment dabei, mit JavaEE eine Webanwendung zu entwickeln. Vor ein paar Tagen hat mir Glassfish nach einem ausgiebigen und verteilten Test (die Glassfish-Instanz stand für alle Projektmitglieder mehrere Tage zur Verfügung) den Dienst mit einer OutOfMemoryException quittiert.
Ich hab also angefangen, mich mit Memory Leaks auseinander zu setzen. Mit dem Netbeans Profiler hab ich herrausgefunden, das die Anzahl der Surviving generations stetig steigt, also irgendwo ein Loch sein muss. Mit dem Profiler von Netbeans komme ich nicht weit. Schon allein das deployen dauert 5 Minuten und während der Profiler läuft, ist Netbeans so gut wie unbenutzbar.
Also ging ich weiter und hab mir einen Heap Dump erstellt. Ergebnis:
- java.util.HashMap$Entry
- org.eclipse.persistence.internal.identitymaps.UnitOfWorkCacheKey
- org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener
- sowie eine Entityklasse aus meinem Projekt
waren in cirka gleicher Anzahl vorhanden, etwa 620000 Stück. Die HashMap-Entries etwas mehr. Dieser Heap Dump entstand während eines Tests, in dem etwa 5000 Entity-Instanzen persistiert werden sollten. (nach 2000 war Schluss, es kam zur OutOfMemoryException.)
Was ich soweit verstanden habe: Der Entity-Manager behält für alle verwalteten Instanzen eine Referenz, alle diese Instanzen werden also nicht von der Garbage Collection erfasst. Was ich allerdings nicht verstehe, ist, wie bitteschön 620000(!) Instanzen existieren können (die auch im EntityManager eingetragen sind - das schließe ich aus der Anzahl vorhandener HashMap$Entry-Instanzen), obwohl nur 2000 erstellt werden sollten.
Ich habe keine Idee, wo ich da mit der Fehlersuche ansetzen kann, bzw welche Werkzeuge ich einsetzen könnte. Für jeden noch so kleinen Hinweis wäre ich dankbar.
Ich setze Netbeans 6.9.1 zusammen mit glassfish 3.0.1 ein (also mit Eclipselink als Persistenz-Provider).
Grüße,
megaflop
Ich bin im Moment dabei, mit JavaEE eine Webanwendung zu entwickeln. Vor ein paar Tagen hat mir Glassfish nach einem ausgiebigen und verteilten Test (die Glassfish-Instanz stand für alle Projektmitglieder mehrere Tage zur Verfügung) den Dienst mit einer OutOfMemoryException quittiert.
Ich hab also angefangen, mich mit Memory Leaks auseinander zu setzen. Mit dem Netbeans Profiler hab ich herrausgefunden, das die Anzahl der Surviving generations stetig steigt, also irgendwo ein Loch sein muss. Mit dem Profiler von Netbeans komme ich nicht weit. Schon allein das deployen dauert 5 Minuten und während der Profiler läuft, ist Netbeans so gut wie unbenutzbar.
Also ging ich weiter und hab mir einen Heap Dump erstellt. Ergebnis:
- java.util.HashMap$Entry
- org.eclipse.persistence.internal.identitymaps.UnitOfWorkCacheKey
- org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener
- sowie eine Entityklasse aus meinem Projekt
waren in cirka gleicher Anzahl vorhanden, etwa 620000 Stück. Die HashMap-Entries etwas mehr. Dieser Heap Dump entstand während eines Tests, in dem etwa 5000 Entity-Instanzen persistiert werden sollten. (nach 2000 war Schluss, es kam zur OutOfMemoryException.)
Was ich soweit verstanden habe: Der Entity-Manager behält für alle verwalteten Instanzen eine Referenz, alle diese Instanzen werden also nicht von der Garbage Collection erfasst. Was ich allerdings nicht verstehe, ist, wie bitteschön 620000(!) Instanzen existieren können (die auch im EntityManager eingetragen sind - das schließe ich aus der Anzahl vorhandener HashMap$Entry-Instanzen), obwohl nur 2000 erstellt werden sollten.
Ich habe keine Idee, wo ich da mit der Fehlersuche ansetzen kann, bzw welche Werkzeuge ich einsetzen könnte. Für jeden noch so kleinen Hinweis wäre ich dankbar.
Ich setze Netbeans 6.9.1 zusammen mit glassfish 3.0.1 ein (also mit Eclipselink als Persistenz-Provider).
Grüße,
megaflop