In Unternehmensanwendungen ist der angegebene Java-Heap meistens größer als die ideale Größe von maximal 12 bis 16 GB. Ich habe es schwierig gefunden, den NetBeans-Profiler direkt auf diesen großen Java-Apps zum Laufen zu bringen.
Aber normalerweise wird dies nicht benötigt. Sie können das mit dem jdk gelieferte Dienstprogramm jmap verwenden, um einen "Live" -Heap-Dump zu erstellen. Das heißt, jmap gibt den Heap nach dem Ausführen von GC aus. Führen Sie eine Operation für die Anwendung aus, warten Sie, bis die Operation abgeschlossen ist, und führen Sie dann einen weiteren "Live" -Heap-Dump durch. Verwenden Sie Tools wie Eclipse MAT, um die Heapdumps zu laden, das Histogramm zu sortieren und festzustellen, welche Objekte zugenommen haben oder welche am höchsten sind. Dies würde einen Hinweis geben.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
Bei diesem Ansatz gibt es nur ein Problem. Riesige Heap-Dumps sind selbst mit der Live-Option möglicherweise zu groß, um in die Entwicklungsrunde übertragen zu werden, und benötigen möglicherweise einen Computer mit genügend Speicher / RAM zum Öffnen.
Hier kommt das Klassenhistogramm ins Spiel. Sie können ein Live-Klassenhistogramm mit dem jmap-Tool sichern. Dies gibt nur das Klassenhistogramm der Speichernutzung an. Grundsätzlich verfügt es nicht über die Informationen, um die Referenz zu verketten. Zum Beispiel kann es ein char-Array an die Spitze setzen. Und String-Klasse irgendwo unten. Sie müssen die Verbindung selbst herstellen.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
Anstatt zwei Heap-Dumps zu erstellen, nehmen Sie zwei Klassenhistogramme wie oben beschrieben. Vergleichen Sie dann die Klassenhistogramme und sehen Sie die Klassen, die zunehmen. Überprüfen Sie, ob Sie die Java-Klassen mit Ihren Anwendungsklassen verknüpfen können. Dies wird einen ziemlich guten Hinweis geben. Hier ist ein Python-Skript, mit dem Sie zwei jmap-Histogramm-Dumps vergleichen können. histogramparser.py
Schließlich sind Tools wie JConolse und VisualVm unerlässlich, um das Speicherwachstum im Laufe der Zeit zu beobachten und festzustellen, ob ein Speicherverlust vorliegt. Schließlich ist Ihr Problem manchmal nicht ein Speicherverlust, sondern eine hohe Speichernutzung. Verwenden Sie dazu die GC-Protokollierung. Verwenden Sie einen fortschrittlicheren und neueren Komprimierungs-GC wie G1GC. und Sie können JDK-Tools wie jstat verwenden, um das GC-Verhalten live zu sehen
jstat -gccause pid <optional time interval>
Andere Referenzen zu googeln für -jhat, jmap, Full GC, Humongous Allocation, G1GC