Commandoregelhulpmiddelen om de Java-heapgrootte te vinden

1. Overzicht

In deze korte zelfstudie maken we kennis met een paar verschillende manieren om de heapgrootte van een actieve Java-applicatie te achterhalen.

2. jcmd

Om de heap- en metaspace-gerelateerde informatie van een actieve Java-applicatie te vinden, kunnen we de jcmd opdrachtregelprogramma:

jcmd GC.heap_info

Laten we eerst de proces-ID van een bepaalde Java-applicatie zoeken met behulp van de jps opdracht:

$ jps -l 73170 org.jetbrains.idea.maven.server.RemoteMavenServer36 4309 quarkus.jar 12070 sun.tools.jps.Jps

Zoals hierboven getoond, is de proces-id voor onze Quarkus-applicatie 4309. Nu we de proces-id hebben, laten we de heap-info bekijken:

$ jcmd 4309 GC.heap_info 4309: garbage-first heap totaal 206848K, gebruikt 43061K regiogrootte 1024K, 43 jonge (44032K), 3 overlevenden (3072K) Metaspace gebruikt 12983K, capaciteit 13724K, toegewijd 13824K, gereserveerd 1060864K klasruimte gebruikt 1599K, capaciteit 1740K, gecommitteerd 1792K, gereserveerd 1048576K

Deze app gebruikt het G1- of garbage-first GC-algoritme:

  • De eerste regel meldt de huidige heapgrootte als 202 MB (206848 K) - ook wordt 42 MB (43061 K) gebruikt
  • G1-regio's zijn 1 MB, er zijn 43 regio's gemarkeerd als jong en 3 als overlevendenruimte
  • De huidige capaciteit van de metasruimte is ongeveer 13,5 MB (13724 K). Van die 13,5 MB wordt ongeveer 12,5 MB (12983 K) gebruikt. We kunnen ook maximaal 1 GB metasruimte hebben (1048576 K). Bovendien is 13842 KB gegarandeerd beschikbaar voor gebruik door de virtuele Java-machine, ook wel bekend als toegewezen geheugen
  • De laatste regel laat zien hoeveel van de metasruimte wordt gebruikt om klasse-informatie op te slaan

Deze uitvoer kan veranderen afhankelijk van het GC-algoritme. Als we bijvoorbeeld dezelfde Quarkus-app draaien met ZGC via "-XX: + UnlockExperimentalVMOptions -XX: + UseZGC":

ZHeap gebruikt 28M, capaciteit 200M, max. Capaciteit 1024M Metaspace gebruikt 21031K, capaciteit 21241K, toegewijd 21504K, gereserveerd 22528K

Zoals hierboven getoond, gebruiken we 28 MB van de heap en ongeveer 20 MB metaspace. Op het moment van schrijven gebruikt Intellij IDEA nog steeds de CMS GC met de volgende heap-info:

par nieuwe generatie totaal 613440K, gebruikt 114299K eden ruimte 545344K, 18% gebruikt vanuit ruimte 68096K, 16% gebruikt naar ruimte 68096K, 0% gebruikt gelijktijdige mark-sweep generatie totaal 1415616K, gebruikt 213479K Metaspace gebruikt 423107K, capaciteit 439976K, vastgelegd 440416K, gereserveerd 1429504K klasruimte gebruikt 55889K, capaciteit 62488K, toegewijd 62616K, gereserveerd 1048576K

We kunnen de klassieke generatie-aard van de CMS GC in de heap-configuratie herkennen.

3. jstat

In aanvulling op jcmd, we kunnen gebruiken jstat om dezelfde informatie van actieve applicaties te achterhalen. We kunnen bijvoorbeeld gebruiken jstat -gc om heap-statistieken te zien:

$ jstat -gc 4309 S0C S1C S0U S1U EC EU OC OU MC 0.0 0.0 0.0 0.0 129024.0 5120.0 75776.0 10134.6 20864.0 MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCTGCT 19946.2 2688.0 2355.0 2 0.007 1 0.020 0 0 0.000

Elke kolom vertegenwoordigt de geheugencapaciteit of het gebruik van een specifiek geheugengebied:

  • S0C - De capaciteit voor de eerste overlevingsruimte
  • S1C - De capaciteit voor het tweede overlevingsvak
  • S0U - De gebruikte ruimte van de eerste overlevende
  • S1U - De gebruikte ruimte van de tweede overlevende
  • EC - Eden ruimtecapaciteit
  • EU - Gebruikte ruimte uit Eden
  • OC - ​​Oude opwekkingscapaciteit
  • OE - Gebruikte ruimte van de oude generatie
  • MC - Metaspace-capaciteit
  • MU - Gebruikte ruimte uit Metaspace
  • CCSC - Gecomprimeerde klasruimtecapaciteit
  • CCSU - Gebruikte ruimte voor gecomprimeerde klassen
  • YGC - Het aantal kleine GC's
  • YGCT - De tijd die wordt besteed aan kleine GC's
  • FGC - Het aantal volledige GC's
  • FGCT - De tijd die wordt besteed aan volledige GC's
  • CGC - Het aantal gelijktijdige GC's
  • CGCT - Tijd besteed aan gelijktijdige GC's
  • GCT - De tijd besteed aan alle GC's

Er zijn andere geheugengerelateerde opties voor jstat zoals:

  • De -gccapaciteit om verschillende capaciteiten voor verschillende geheugengebieden te rapporteren
  • De -gcutil toont alleen het bezettingspercentage van elke regio
  • De oorzaak is hetzelfde als -gcutil maar voegt de oorzaak toe van de laatste GC en mogelijk huidige GC-gebeurtenissen

4. Opdrachtregelargumenten

Als we een Java-applicatie uitvoeren met heap-configuratie-opties (bijvoorbeeld -Xms en -Xmx), dan zijn er een paar andere trucs om de opgegeven waarden te vinden.

Hier is bijvoorbeeld hoe jps rapporteert die waarden:

$ jps -lv 4309 quarkus.jar -Xms200m -Xmx1g

Met deze benadering kunnen we alleen deze statische waarden vinden. Er is dus geen manier om bijvoorbeeld de huidige vastgelegde herinnering te kennen.

In aanvulling op jps, zullen een paar andere tools hetzelfde rapporteren. Bijvoorbeeld de "Jcmd VM.command_line" zal ook deze details rapporteren:

$ jcmd 4309 VM.command_line 4309: VM Argumenten: jvm_args: -Xms200m -Xmx1g java_command: quarkus.jar java_class_path (initieel): quarkus.jar Launcher Type: SUN_STANDARD

Ook kunnen we op de meeste op Unix gebaseerde systemen gebruiken ps van de procps pakket:

$ ps -ef | grep quarkus ... java -Xms200m -Xmx1g -jar quarkus.jar

Ten slotte kunnen we op Linux de / proc virtueel bestandssysteem en zijn pid-bestanden:

$ cat / proc / 4309 / cmdline java -Xms200m -Xmx1g -jar quarkus.jar

De cmdline -bestand, in een map genoemd naar de Quarkus-pid, bevat de opdrachtregelvermelding voor de toepassing.

5. Conclusie

In deze korte tutorial hebben we een paar verschillende manieren gezien om de heap-grootte van een actieve Java-applicatie te krijgen.


$config[zx-auto] not found$config[zx-overlay] not found