Ich arbeite an einer großen Anwendung (300K LOC), die einen Speicherverlust in der Sun 1.6 JVM (1.6_05) verursacht. Profiling der Java zeigt kein Leck. Gibt es Diagnosemöglichkeiten von der JVM, die die Ursache des Lecks erkennen könnten?
Ich konnte keinen einfachen, isolierten Java-Testfall erstellen. Ist das der einzige Weg, das herauszufinden, indem Sie einen C-Heap-Analysator auf der JVM verwenden?
Die Anwendung erstellt einen Pool von Sockets und führt eine erhebliche Menge an Netzwerk-E/A.Wie diagnostizieren Sie ein Leck im C-Speicher, das durch ein Java-Programm verursacht wurde?
6
A
Antwort
2
Einige Profiler wie profiler4j können den verwalteten und den nicht verwalteten Speicher (Live-Kurve) anzeigen. Dann können Sie sehen, wenn Sie ein Leck haben und wenn das Leck auftritt. Aber Sie finden nicht mehr Informationen.
Danach gibt es zwei mögliche Lösungen:
- Sie mit der Live-Kurve kann das Problem zu isolieren und einen einfacheren Test erstellen, bis Sie die Ursache des Problems finden haben.
- Sie suchen Ihren Code für die typischen Probleme wie:
- Instanzen der Klasse Thread, die nie beginnen werden.
- Bilder oder Grafiken, die nie
- ODBC-Bridge-Objekte verfügen, die nie in der Nähe sind
0
Ich liebe valgrind (http://valgrind.org/), wenn Sie es auf einem System ausgeführt werden unterstützt. Es rockt wirklich!