Finden Sie Speicherlecks in Java
In diesem Artikel erfahren Sie, wie Sie ein Java Memory Leak finden.
Nicht verwendete Elemente, die zusätzlichen Speicherplatz beanspruchen, werden als Speicherlecks bezeichnet. Speicherlecks sind problematisch, da sie Speicherressourcen verstopfen und die Systemleistung im Laufe der Zeit verlangsamen.
Wird dieses Problem nicht behoben, gehen dem Programm letztendlich die Ressourcen aus und es stürzt mit einem fatalen java.lang.OutOfMemoryError
ab.
Einer der Hauptvorteile ist die automatische Speicherverwaltung durch Javas eingebauten Garbage Collector
. Der Garbage Collector kann den Großteil der Speicherverlustprobleme lösen, da er implizit die Speicherzuweisung und -freigabe handhabt.
Obwohl der Garbage Collector einen großen Teil des Speichers erfolgreich verwaltet, kann er keinen ausfallsicheren Schutz gegen Speicherlecks bieten. Der Garbage Collector ist intelligent, aber nicht perfekt.
Sogar Apps, die von einem gewissenhaften Entwickler erstellt wurden, sind anfällig für Speicherlecks.
Ursachen von Speicherlecks in Java
Ein Java-Speicherleck tritt häufig auf, wenn eine Anwendung versehentlich Objektreferenzen festhält, die nicht mehr benötigt werden. Der Java-Garbage-Collection-Prozess kann den von diesen Objekten verwendeten Speicher aufgrund der unbeabsichtigten Objektreferenzen nicht freigeben.
Im Folgenden sind einige der häufigsten Ursachen für Speicherlecks aufgeführt.
- Caches ohne Limit.
- Eine große Anzahl von Sitzungsobjekten.
- Einfügen in Sammlungsobjekte ohne Löschen.
- Ungenutzte Listener-Methoden.
- Übermäßige Seitenumschaltung im Betriebssystem.
- Benutzerdefinierte Datenstrukturen, die schlecht geschrieben sind.
Finden Sie Speicherlecks in Java
Das Auffinden von Speicherlecks kann schwierig sein, da es keinen absoluten Weg gibt, Speicherlecks zu finden. Um die Speicherlecks in Java zu finden, haben wir einige effiziente Möglichkeiten, und das sind:
Speicherprofiler verwenden
Mit der Java-Profilerstellung können Sie viele JVM-Merkmale nachverfolgen, z. B. Methodenausführung, Objektgenerierung, Thread-Ausführung und Papierkorbsammlung. Speicherprofiler können verfolgen, wie viel Speicher verwendet wird, und beim Auffinden von Speicherlecks in einer Anwendung helfen.
Profiler können auch dabei helfen, zu untersuchen, wie Ressourcen innerhalb einer Anwendung zugewiesen werden, z. B. wie viel Speicher und CPU jede Funktion verbraucht. Mit dem Speicherprofiler können wir alle Probleme identifizieren und finden.
Mit Java-Profilerstellungstools können Sie die folgenden Metriken ermitteln.
- Details von Methodenaufrufen
- Speicherverbrauch
- CPU-Zeit einer Methode
- Die erstellten Objekte
- Die vom Garbage Collector entfernten Objekte.
Verwenden von Heap-Dumps
Es ist eine weitere Technik zum Auffinden von Speicherlecks in Java. Heap-Dumps bieten eine Momentaufnahme des Heap-Speichers, der von einer Java-Anwendung zu einem bestimmten Zeitpunkt verwendet wird.
Sie zeigen die Anzahl der geöffneten Objektinstanzen und deren Speicherverbrauch. Heap-Dumps können bei der Bestimmung helfen, wie viele Objekte in einer Anwendung erzeugt werden und ob eines davon möglicherweise Speicherverluste verursacht.
Ausführliche Garbage Collection
Die ausführliche Garbage-Collection kann aktiviert werden, um eine detaillierte Ablaufverfolgung der Java-Garbage-Collection zu erhalten. Fügen Sie das folgende Argument zur JVM-Konfiguration hinzu, um die ausführliche Garbage Collection zu aktivieren.
-verbose:gc
Die als Standardfehlerbericht angezeigte Zusammenfassung kann verwendet werden, um zu erfahren, wie der Speicher gehandhabt wird, und um Speicherlecks zu erkennen.
Verwenden von Eclipse-Speicherleckwarnungen
Die Verwendung der Speicherleckwarnungen von Eclipse ist eine weitere Methode zum Auffinden von Speicherlecks. Eclipse kann Sie benachrichtigen, wenn eine Referenz beendet wird, aber ein Objekt fortgeführt und nicht geschlossen wird, wenn Ihr Code JDK 1.5
oder höher entspricht.
Stellen Sie sicher, dass Ihre Projekteinstellungen die Lecksuche zulassen. Denken Sie daran, dass die Verwendung von Eclipse möglicherweise keine vollständige Lösung darstellt.
Insbesondere wenn Ihr Code nicht mit JDK 1.5
(oder höher) kompatibel ist, erkennt Eclipse möglicherweise nicht alle Leaks und erkennt einige Dateischließungen nicht.
Andere Werkzeuge
-
NetBeans Profiler
– Es kann Speicher, Threads und CPU-Ressourcen überwachen und unterstützt Java SE, Java FX, EJB, mobile Apps und Webanwendungen. -
VisualVM
–VisualVM
, aufgebaut auf der NetBeans-Plattform, ist ein leicht erweiterbares Tool, das Ihnen mit einer Vielzahl von Plugins umfangreiche Informationen zu Ihren Anwendungen zur Überwachung entfernter und lokaler Programme bietet. Mit diesem Programm können Sie den Garbage Collector manuell ausführen und ein Speicherprofil erstellen. -
JProfiler
– Es ist ein Tool zum Profilieren von Threads, Speicher und CPUs, das auch Speicherlecks und andere Leistungsprobleme untersuchen kann. -
GCeasy
–GCeasy
ist ein Tool, das Garbage-Collection-Protokolle analysiert und einen einfachen Ansatz bietet, um Probleme mit Speicherlecks zu finden, während Garbage-Collection-Protokolle überprüft werden. Die Nutzung vonGCeasy
wird zusätzlich durch die Tatsache gefördert, dass online darauf zugegriffen werden kann, ohne dass eine Computerinstallation erforderlich ist. -
GC Viewer
– Es ist ein Open-Source-Programm, das eine schnelle und einfache Visualisierung von Informationen mithilfe von JVM-Daten ermöglicht.GC Viewer
zeigt Garbage-Collection-Leistungsinformationen wie kumulative Pausen, am längsten verlängerte Pausen und Durchsatz an.Mit diesem Programm können Sie nicht nur die Garbage Collection starten, sondern auch die anfängliche Heap-Größe angeben.
-
Patty in action
– Dies ist ein weiteres Open-Source-Programm, mit dem Sie sich selbst profilieren und ein gezieltes, tiefes Profiling erhalten können. Dieses Tool kann verwendet werden, um Haufen zu untersuchen. -
JRockit
–JRockit
ist eine proprietäre Oracle-Lösung für Java SE-Anwendungen, die Verzögerungen vorhersagen, Garbage Collection anzeigen und speicherbezogene Probleme analysieren kann.
In diesem Tutorial haben wir etwas über Speicherlecks in Java, ihre verschiedenen Ursachen und wie man sie findet, gelernt. In diesem Tutorial werden verschiedene Tools und Techniken besprochen.
Benutzer können den Techniken und Tools folgen, um Speicherlecks zu reduzieren und die Leistung der Anwendung zu verbessern.