Der tatsächlich von der Java-App verwendete Speicher kann nicht mit dem Befehl top abgerufen werden. ** Wenn Sie den Befehl top ausführen, erfahren Sie nur, wie viel Speicher die JVM zugewiesen hat. ** ** ** Dieses Mal zeige ich Ihnen, wie Sie mit dem jstat-Tool eine ungefähre Vorstellung von der Größe des tatsächlichen Java-Speichers erhalten. Mit dieser Methode können Sie die ungefähre Speichermenge anzeigen, ohne die Verarbeitung wesentlich zu beeinträchtigen, ohne die Anwendung zu ändern.
jstat ist ein Tool zur Überwachung statistischer Daten von virtuellen Java-Maschinen. Da es im JDK enthalten ist, wird es bei der Installation des JDK installiert und ist gleichzeitig einsatzbereit. Bitte beachten Sie jedoch, dass die offizielle Dokumentation besagt, dass es sich um eine experimentelle Funktion handelt und möglicherweise in Zukunft keine Version mehr ist.
Führen Sie die Beispiel-App zur entsprechenden Verarbeitung aus. Die folgenden Optionen werden beim Starten von Java hinzugefügt, und die maximale und minimale Größe des Heapspeichers werden mit 20 GB angegeben.
-xms20g -xmx20g
Es ist eine Anwendung, die eine Stapelverarbeitung durchführt, die von Anfang bis Ende etwa 3000 Sekunden dauert.
Ich werde die Details des Programms weglassen.
Überprüfen Sie nach dem Starten der Beispiel-App die Prozess-ID der App mit dem Befehl jps.
$ jps
29366 Jps
31781 sampleApp
Die Prozess-ID von sampleApp lautet 31781. Ich möchte den Befehl jstat ausführen und das Ergebnis in eine Datei schreiben. Führen Sie den folgenden Befehl aus.
$ jstat -gcutil -t 31781 1000 > jstat.tsv
Dieses Mal werden jede Sekunde die GC-Statistik und der Zeitstempel vom Start der Anwendung zusammen angezeigt. Es wird als Datei mit dem Namen "jstate.tsv" ausgegeben. Auf der offiziellen Seite finden Sie die Optionen des Befehls jstat.
Die Ausgabe des Befehls jstat lautet wie folgt.
Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
39.8 0.00 0.00 38.00 0.00 17.13 19.75 0 0.000 0 0.000 0.000
40.8 0.00 0.00 44.00 0.00 17.13 19.75 0 0.000 0 0.000 0.000
~~ weggelassen ~~
3019.0 63.30 74.99 100.00 53.52 96.26 86.35 753 414.206 25 581.636 995.842
3020.0 78.67 74.99 100.00 53.52 96.26 86.35 753 414.206 25 581.636 995.842
Anhand der Ausgabe des Befehls jstat untersuchen wir den tatsächlich verwendeten Speicher. ** Um den groben Übergang des verwendeten Speichers zu untersuchen, reicht es aus, nur das Element "O" (Old Area Memory Allocation Rate = Nutzungsrate) in der Ausgabe von jstat zu beachten. ** ** **
Die folgende Grafik zeigt den Wert von "Zeitstempel" auf der horizontalen Achse und den Wert von "O" auf der vertikalen Achse.
In diesem Diagramm können Sie die Speichernutzung lesen. Auf den ersten Blick schwankt die Speicherzuordnungsrate jedoch stark zwischen 50% und 100%, was nicht klar ist. ** Der alte Bereich enthält eine Mischung aus Daten, die zu diesem Zeitpunkt tatsächlich verwendet werden, und Daten, die nicht mehr verwendet werden. Sie müssen also nur die Datenmenge ermitteln, die verwendet wird. ** ** ** Die folgende Grafik zeigt den Ausführungszeitpunkt von Full GC, der der obigen Grafik mit einer blauen gestrichelten Linie überlagert ist.
Sie können sehen, dass die Speichernutzung nach dem vollständigen GC gering ist. ** Sie können die tatsächliche Speichernutzung der App anzeigen, indem Sie nur die Speicherzuweisungsrate betrachten, wenn der Speicher unmittelbar nach diesem vollständigen GC abfällt. ** ** ** In der folgenden Abbildung sind die reduzierten Zeitwerte durch eine durchgezogene rote Linie verbunden. Und dieser Wert ist der ungefähre Übergang des tatsächlich verwendeten Speichers.
Wenn Sie die obige Grafik überprüfen, sehen Sie Folgendes.
Darüber hinaus ist es möglich, die ungefähre Speichernutzung in jedem Prozess zu überprüfen, indem Sie sie mit dem Protokoll der Anwendung vergleichen.
Warum können wir die Speichernutzung nur anhand der Größe des alten Bereichs nach FullGC ermitteln? Um dies zu verstehen, müssen Sie wissen, wie die JVM-Speicherverwaltung funktioniert. Hier sind jedoch einige sehr vereinfachte.
Wir haben zusammengefasst, wie Sie die Speichernutzung von Java-Apps mit dem Befehl jstat überprüfen können. Ich denke, es ist eine gute Idee, die Speichernutzung für jeden Prozess mit dieser Methode grob zu überprüfen und dann die Speichernutzung jedes Objekts zu untersuchen, insbesondere in Prozessen, die Speicher verwenden.
Recommended Posts