Nástroje príkazového riadku na vyhľadanie veľkosti haldy Java

1. Prehľad

V tomto rýchlom výučbe sa oboznámime s niekoľkými rôznymi spôsobmi, ako zistiť veľkosť haldy spustenej aplikácie Java.

2. jcmd

Na vyhľadanie informácií o halde a metaspace spustenej aplikácie Java môžeme použiť jcmd obslužný program príkazového riadku:

jcmd GC.heap_info

Najskôr nájdeme ID procesu konkrétnej aplikácie Java pomocou znaku jps príkaz:

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

Ako je uvedené vyššie, ID procesu pre našu aplikáciu Quarkus je 4309. Teraz, keď máme ID procesu, pozrime sa na haldu:

$ jcmd 4309 GC.heap_info 4309: halda prvého odpadu celkovo 206848K, použitá 43061K veľkosť regiónu 1024K, 43 mladých (44032K), 3 preživší (3072K) využitý Metaspace 12983K, kapacita 13724K, vyhradený 13824K, vyhradený priestor triedy 1060864K použitý 1599K, kapacita 1740 tis., Viazaných 1792 tis., Rezervovaných 1048 576 tis

Táto aplikácia používa algoritmus G1 alebo GC prvý:

  • Prvý riadok uvádza aktuálnu veľkosť haldy ako 202 MB (206848 kB) - používa sa tiež 42 MB (43061 kB)
  • Regióny G1 majú veľkosť 1 MB, existuje 43 regiónov označených ako mladé a 3 ako priestor pre preživších
  • Aktuálna kapacita metaspace je okolo 13,5 MB (13724 K). Z toho 13,5 MB sa použije okolo 12,5 MB (12983 K). Môžeme tiež mať až 1 GB metaspace (1048576 kB). Okrem toho je zaručené, že 13842 kB bude k dispozícii na použitie virtuálnym strojom Java, známym tiež ako potvrdená pamäť
  • Posledný riadok ukazuje, koľko z metaspace sa používa na ukladanie informácií o triede

Tento výstup sa môže meniť v závislosti od algoritmu GC. Napríklad, ak spustíme rovnakú aplikáciu Quarkus so ZGC cez „-XX: + UnlockExperimentalVMOptions -XX: + UseZGC“:

ZHeap použitý 28M, kapacita 200M, maximálna kapacita 1024M Metaspace použitý 21031K, kapacita 21241K, nasadený 21504K, rezervovaný 22528K

Ako je uvedené vyššie, používame 28 MB haldy a približne 20 MB metaspace. V čase písania tohto dokumentu Intellij IDEA stále používa CMS GC s nasledujúcimi informáciami o halde:

par nová generácia celkom 613440K, využitá 114299K eden space 545344K, 18% využitá z space 68096K, 16% použitá do space 68096K, 0% použitá súbežná generácia vymetania značiek celkovo 1415616K, použitá 213479K Metaspace použitá 423107K, kapacita 439976K, vyhradená 440416K, rezervovaná Využité miesto v triede 1429504K 55889K, kapacita 62488K, vyhradené 62616K, rezervované 1048576K

Vidíme klasickú generačnú povahu CMS GC v konfigurácii haldy.

3. jstat

Okrem tohoto jcmd, môžeme použiť jstat zistiť rovnaké informácie zo spustených aplikácií. Napríklad môžeme použiť jstat -gc zobraziť štatistiku haldy:

$ 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,000

Každý stĺpec predstavuje kapacitu pamäte alebo využitie konkrétnej oblasti pamäte:

  • S0C - kapacita pre prvý preživší priestor
  • S1C - kapacita pre druhý preživší priestor
  • S0U - Využitý priestor prvého preživšieho
  • S1U - Využitý priestor druhého preživšieho
  • ES - kapacita priestoru Eden
  • EÚ - využitý priestor z Edenu
  • OC - ​​kapacita starej generácie
  • OU - Použité miesto zo starej generácie
  • MC - kapacita metaspace
  • MU - Využité miesto z Metaspace
  • CCSC - kapacita priestoru komprimovanej triedy
  • CCSU - Využité miesto pre komprimované triedy
  • YGC - počet menších GC
  • YGCT - čas strávený pre menšie GC
  • FGC - počet celých GC
  • FGCT - čas strávený celými GC
  • CGC - počet súbežných GC
  • CGCT - čas strávený na súbežných GC
  • GCT - čas strávený pre všetky GC

Existujú ďalšie možnosti týkajúce sa pamäte jstat ako napríklad:

  • The -gc kapacita hlásiť rôzne kapacity pre rôzne oblasti pamäte
  • The -gcutil zobrazuje iba percento využitia každého regiónu
  • The -gccause je to isté ako -gcutil ale pridáva príčinu posledných GC a možno aj aktuálnych udalostí GC

4. Argumenty príkazového riadku

Ak spustíme aplikáciu Java s možnosťami konfigurácie haldy (napríklad -Xms a -Xmx), potom existuje niekoľko ďalších trikov na nájdenie zadaných hodnôt.

Napríklad takto jps hlási tieto hodnoty:

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

S týmto prístupom môžeme nájsť iba tieto statické hodnoty. Nie je teda možné vedieť, napríklad o súčasnej spáchanej pamäti.

Okrem tohoto jps, niekoľko ďalších nástrojov bude hlásiť to isté. Napríklad „Jcmd VM.command_line“ tiež nahlási tieto podrobnosti:

$ jcmd 4309 VM.command_line 4309: VM Argumenty: jvm_args: -Xms200m -Xmx1g java_command: quarkus.jar java_class_path (initial): quarkus.jar Typ spúšťača: SUN_STANDARD

Tiež môžeme použiť na väčšine systémov založených na Unixe ps z procps balenie:

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

Nakoniec v systéme Linux môžeme použiť / proc virtuálny súborový systém a jeho súbory pid:

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

The cmdline Súbor v adresári pomenovanom podľa pid Quarkus obsahuje položku príkazového riadku pre aplikáciu.

5. Záver

V tomto rýchlom výučbe sme videli niekoľko rôznych spôsobov, ako získať haldy spustenej aplikácie Java.