Speichermessung für Java-Apps mit jstat

Übersicht über die verwendete Java-Speichergröße

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 vorbereiten

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.

Analyseprogramm

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.

Führen Sie jstat aus

Ü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.

Ausgabe 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

Analyse der verwendeten Speichergröße

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.

old領域割り当て率のグラフ

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.

old領域割り当て率のグラフ(FGC実行明示)

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.

old領域割り当て率のグラフ(ヒープメモリ概要)

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.

Kurze Erklärung dieser Methode

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.

  1. In Java-Anwendungen werden alle Daten, die für einen bestimmten Zeitraum im Speicher verbleiben, im alten Speicherbereich gespeichert.
  2. Wenn der alte Bereich voll ist (ungefähr 90% oder mehr), wird Full GC ausgeführt, untersucht alle Daten im alten Bereich, gibt den Speicher frei, wenn nicht verwendete Daten vorhanden sind und nur die verwendeten Daten alt sind. In der Gegend lassen.
  3. Wenn Sie sich die Datenmenge im Bereich Alt unmittelbar nach FullGC ansehen, können Sie die Speichermenge ermitteln, die nicht freigegeben werden kann (tatsächlich von der App verwendet wird).

Zusammenfassung

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

Speichermessung für Java-Apps mit jstat
Hinweise zur Verwendung von BLE in iOS-Apps
Speichermessung von Java-Apps unter Windows
Aktualisieren der Java-Umgebung von Windows mit Chocolatey
Geben Sie Optionen für die Java / Kotlin-Kompilierungszeit für Android-Apps an
ChatWork4j für die Verwendung der ChatWork-API in Java
Für JAVA-Lernen (2018-03-16-01)
[Java-Entwicklung] Java-Speicher
Java Nr. 3 für die Stream-Speichernutzung, die für Unternehmen nützlich ist
2017 IDE für Java
Java für Anweisung
[Java] [SQL Server] Stellen Sie mit JDBC für SQL Server eine Verbindung zum lokalen SQL Server 2017 her
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Bibliothek zur Messung der Java-Abdeckung
[Java] für Anweisung, während Anweisung
Sortieren mit Java-Komparator
[Java] Paket für die Verwaltung
[Java] für Anweisung / erweitert für Anweisung
Schrottpraxis mit Java ②
Gegenmaßnahmen für OutOfMemoryError in Java
NLP für Java (NLP4J) (2)
(Memo) Java für Anweisung
NLP für Java (NLP4J) (1)
Schrottpraxis mit Java ①
So erstellen Sie ein leichtes Container-Image für Java-Apps
Erstellen Sie einen QR-Code für Google Authenticator mit ZXing in Java
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
Versuchen Sie Spark Submit to EMR mit AWS SDK für Java
BCrypt + Verarbeitungszeitmessung für jede Streckenanzahl in Java