2008-09-20 1 views
6

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?

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:

  1. Sie mit der Live-Kurve kann das Problem zu isolieren und einen einfacheren Test erstellen, bis Sie die Ursache des Problems finden haben.
  2. Sie suchen Ihren Code für die typischen Probleme wie:
    1. Instanzen der Klasse Thread, die nie beginnen werden.
    2. Bilder oder Grafiken, die nie
    3. 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!