jb2works.comjb2works.com

jb2works.com > Java Memory Leak FAQ     eng | de

Java Memory Leak - Frequently Asked Questions
Warum gibt mein Programm den Speicher nicht frei? Wieso werden meine Objekte nicht garbage-collected? - Solche Fragen werden oft in groesseren Java-Projekten gestellt. Diese Website erklaert, warum derartige Dinge passieren, wie man ein Memory Leak findet und behebt und was man typischerweise beachten sollte, um Speicherproblemen von Anfang an aus dem Weg zu gehen.

Warum gibt meine Applikation den Speicher nicht frei?
Warum wird mein Objekt nicht garbage-collected?
Wenn das Objekt sogar noch da ist, nachdem die Garbage-Collection gerufen wurde, dann liegt es nahezu immer daran, dass das Objekt noch fest erreichbar ist. Fest erreichbar von einem static root oder auch von der main instance selbst. Mindestens ein anderes Objekt referenziert das Objekt. Deswegen nimmt die Virtuelle Maschine an, dass das Objekt noch in Benutzung ist.

Wenn ein Programm Speicher verliert, weil es die Referenzierung des Speichers nicht aufhebt, dann nennen wir dieses Problem 'Data Cancer' - Datenkrebs. Der Heap waechst und waechst. Im schlechtesten Fall wirft das Programm spaeter eine 'Out Of Memory' Exception - es hat keinen Speicher mehr um weiterzuleben.

In Java sind Memory Leaks typischerweise vom Typ 'Data Cancer'.

Was noch kann Memory Leaks verursachen?
Memory Leaks, die nicht 'Data Cancers' sind:

  • Native Memory Leaks - z.B. vergessene dispose() Calls oder Bugs in der JVM,
  • Falsche Implementierungen von Finalizers - Finalizers sind keine Destruktoren,
  • Objekte wartend in Finalizer Queues und Reference Queues, und
  • Kaskadierende Effekte mit Objekten vom Typ 'java.lang.Reference'.

  • Alle diese Probleme treten sehr selten auf verglichen mit dem 'Data Cancer' Typ.

    Ist es moeglich, dass Abhaengigkeiten zwischen den Objekten zu hoch sind?
    Dass die JVM nicht mehr aufraeumen kann?
    Wir denken, dieser Mythos ist falsch. Wenn immer man uns sagte, dass die JVM es nicht mehr schafft, dann stellte sich dann doch ein ganz normales Memory Leak heraus. Sehr oft haben die gaengigen JVMPI Tools einfach Probleme, alle Referenzen zu finden und die Reference Graphen uebersichtlich darzustellen. Probieren Sie doch einfach mehrere Tools aus.

    Was kann ich gegen Data Cancer tun?
    Eine der erfolgreichsten Methoden ist diese hier:

  • Definiere zwei Zeitpunkte um einen Heap-Snapshot zu nehmen.
  • Fertige einen Diff von den Snapshots an.
  • Analysiere den Reference Graph zu Instanzen, die im Diff verblieben sind.
  • Simuliere eine oder mehrere Loesungen.
  • Implementiere eine Loesung.

  • Waehlen Sie den zweiten Zeitpunkt so heap-neutral wie moeglich bezueglich des ersten Zeitpunkts. Kehren Sie zu einem Zustand zurueck, wo nicht mehr Objekte zu erwarten waeren als zuvor. Bitte denken Sie auch an ungespeicherte Aenderungen (Save?), Histories, Undo-Listen, Caches, Pools usw. .

    Welche Eigenschaften sollte ein Tool haben, um Memory Leaks zu fixen?
    Eine kurze Zusammenstellung von Eigenschaften, die wir geeignet finden:

  • Kann Heap-Snapshots anfertigen.
  • Kann ein Diff von Snapshots anfertigen.
  • Findet alle Referenzen auf eine Instanze.
  • Zeigt den Reference Graph vom Reference hinauf zu einem static root oder zur main instance.
  • Sollte Loesungen simulieren koennen, denn ein Reference kann meist ueber mehrfache Wege erreicht werden.
  • Sollte den Heap zeigen so als ob die Garbage Collection auf dem Fluge arbeiten wuerde. Denn man sollte nicht noch die Garbage Collection beachten muessen.

  • Wichtig ist auch, wie ein Tool durch einen Reference Graph navigieren laesst und wie intuitiv es die Information anzeigt. Ein Tool, dass nur ein Level eines Reference Graphs zeigt, wird nicht sehr hilfreich sein. Reference Graphen erreichen nicht selten mehr als 100 Levels.

    Welches Tool empfehlen Sie?
    Wir empfehlen den Reference Scanner von unserer Website.
    Dieses Werkzeug schrieben wir, weil wir fanden, dass uns die bekannten populaeren Tools nicht sehr helfen in unserer taeglichen Arbeit. Es hat all diese Eigenschaften, die gerade beschrieben wurden, ist schnell und hat einen niedrigen Speicherverbrauch.

    Sie koennen auch einen der konventionellen JVMPI Profiler verwenden, die einen anderen Ansatz als unser Tool verfolgen und etwas Support beim Finden von Memory Leaks bieten. Die bekanntesten Tools sind OptimizeIt and JProbe.

    Was kann ich tun, um Memory Leaks zu verhindern wenn ich Code schreibe?
    Wir haben die wenigen Coding-Patterns aufgefuehrt, die ueblicherweise Memory Leaks verursachen.
    Bitte schauen Sie nach Die Top Five - Warum wir einen Datenkrebs haben.

    FAQ
    Warum wird mein Objekt nicht garbage-collected?

    Was noch kann Memory Leaks verursachen?

    Ist es moeglich, dass Abhaengigkeiten zwischen den Objekten zu hoch sind?

    Was kann ich gegen Data Cancer tun?

    Welche Eigenschaften sollte ein Tool haben, um Memory Leaks zu fixen?

    Welches Tool empfehlen Sie?

    Was kann ich tun, um Memory Leaks zu verhindern wenn ich Code schreibe?


    Reference Scanner
    Untersuchen Sie Ihre laufende Java Anwendung von einem Webbrowser: Erstellen Sie Heap Snapshots und Snapshot Diffs. Schauen Sie sich Memory Leaks an und beseitigen Sie sie. Verfolgen Sie den vollstaendigen Reference Graphen zu Objekten ...

    Mehr ...


    DataCancer Top Five
    Die Top Five
    oder - Warum wir einen Datenkrebs haben.