Ich habe eine JBoss-Anwendung, die auf einer Linux-Plattform läuft. Sie hat die folgende Top-Ausgabe (die Daten sind eigentlich nicht genau):
PID USER PR NI VIRT RES SHR S %CPU %MEM CODE DATA TIME+ COMMAND
1379 root 16 0 9.7g 1.6g 1980 S 0.7 1.3 36 9.7g 0:11.03 java
Es verfügt insgesamt über 1,6 GB physischen Speicher und einen 9,7 GB DATA-Teil. Tatsächlich beträgt die Heap-Größe gemäß der JVM-Konfiguration ~128 MB. Meine Frage lautet: Was speichert der DATA-Teil für die Java-Anwendung? Irgendeine Ahnung? Und wie kann ich ihn optimieren?
Danke, Emre
Antwort1
DATA
bedeutet von der Anwendung zugewiesener Speicher brk(2)
, d. h. Erweiterung des Datensegments.
Java fügt viele verschiedene Dinge in das Datensegment ein:
- Der Haufen
- Jeglicher von der nativen Laufzeitschicht zugewiesener Speicher (Code mit dem
native
Schlüsselwort) - Jeglicher Speicher, der von DLLs/gemeinsam genutzten Bibliotheken zugewiesen wird, die Sie mit JNI/JNA aus Java laden
- Speicher, in den Bytecode vom JIT geladen, interpretiert und kompiliert wird (Code-Cache)
- Vom GC und anderem Laufzeit-Supportcode verwendete Speicherstrukturen
- Der Stapel
Beachten Sie, dass einem Programm bei der Zuweisung eines Heaps von 128 MB mehr zugewiesen wird, da Java auch einige Strukturen zur Verwaltung des Heaps erstellt, die nicht Teil des Heaps sind. 128 MB bedeuten also, dass Sie 128 MB haben, in denen Sie Java-Objekte zuweisen können.
Antwort2
Dies ist die Menge an physischem Speicher, die für andere als ausführbaren Code reserviert ist. Diese Größe wird auch als „Data Resident Set“-Größe oder DRS bezeichnet. Normalerweise können Sie eine Manualpage zu Rate ziehen, die alle Spalten detailliert beschreibt. Um eine Manualpage zu erhalten, geben Sie ein man top
.