Parancssori eszközök a Java kupacméret megkereséséhez

1. Áttekintés

Ebben a gyors bemutatóban megismerkedünk néhány különböző módszerrel a futó Java-alkalmazások halomméretének megszerzéséhez.

2. jcmd

A futó Java-alkalmazások halmával és metatérrel kapcsolatos információinak megkereséséhez használhatjuk a jcmd parancssori segédprogram:

jcmd GC.heap_info

Először keressük meg egy adott Java alkalmazás folyamatazonosítóját a jps parancs:

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

Mint fent látható, a Quarkus alkalmazás folyamatazonosítója 4309. Most, hogy megvan a folyamatazonosító, nézzük meg a kupacinformációt:

$ jcmd 4309 GC.heap_info 4309: első szemétdomb 206848K, használt 43061K régióméret 1024K, 43 fiatal (44032K), 3 túlélő (3072K) Metaspace használt 12983K, kapacitás 13724K, elkötelezett 13824K, fenntartott 1060864K használt hely 1599K, kapacitás 1740K, elkötelezett 1792K, fenntartva 1048576K

Ez az alkalmazás a G1 vagy a szemét-első GC algoritmust használja:

  • Az első sor a jelenlegi halom méretét 202 MB-nak (206848 K) jelenti - 42 MB-ot (43061 K) is használnak
  • A G1 régiók 1 MB méretűek, 43 régió fiatalnak, 3 pedig túlélőnek számít
  • A metatér jelenlegi kapacitása 13,5 MB (13724 K) körül van. Ettől a 13,5 MB-tól körülbelül 12,5 MB (12983 K) kerül felhasználásra. Emellett rendelkezhetünk akár 1 GB metatérrel (1048576 K). Ezenkívül 13842 KB garantáltan elérhető lesz a Java virtuális gép számára, más néven elkötelezett memóriának
  • Az utolsó sor megmutatja, hogy a metatér mekkora részét használják fel az osztályinformációk tárolására

Ez a kimenet a GC algoritmustól függően változhat. Például, ha ugyanazt a Quarkus alkalmazást futtatjuk a ZGC-vel a következőn keresztül: „-XX: + UnlockExperimentalVMOptions -XX: + UseZGC”:

ZHeap használt 28M, kapacitás 200M, maximális kapacitás 1024M Metaspace használt 21031K, kapacitás 21241K, elkötelezett 21504K, fenntartva 22528K

Amint a fentiekből látható, 28 MB-ot használunk a kupacból és körülbelül 20 MB-ot a metatérből. Az írás kezdetén az Intellij IDEA továbbra is a CMS GC-t használja a következő kupacinformációkkal:

par új generáció összesen 613440K, használt 114299K Eden space 545344K, 18% felhasználva az űrből 68096K, 16% használt az űrbe 68096K, 0% egyidejűleg használt mark-sweep generáció összesen 1415616K, használt 213479K Metaspace használt 423107K, kapacitás 439976K, lekötve 440416K, fenntartva 1429504K osztályterület 55889K, kapacitás 62488K, lekötött 62616K, fenntartva 1048576K

A halom konfigurációban észrevehetjük a CMS GC klasszikus generációs jellegét.

3. jstat

Továbbá jcmd, tudjuk használni jstat hogy ugyanazokat az információkat megtudja a futó alkalmazásokból. Például használhatjuk jstat -gc halom statisztikák megtekintéséhez:

$ 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 2320,0 0 0,007 1

Minden oszlop egy adott memóriaterület memóriakapacitását vagy kihasználtságát mutatja:

  • S0C - Az első túlélőtér kapacitása
  • S1C - A második túlélőtér kapacitása
  • S0U - Az első túlélő felhasznált területe
  • S1U - A második túlélő használt területe
  • EC - Eden űrkapacitás
  • EU - Használt hely Edenből
  • OC - ​​régi generációs kapacitás
  • OU - Használt hely a régi generációból
  • MC - Metaspace kapacitás
  • MU - Használt hely a Metaspace-től
  • CCSC - Tömörített osztálytermi kapacitás
  • CCSU - Használt hely a tömörített osztályok számára
  • YGC - A kisebb GC-k száma
  • YGCT - A kisebb GC-k számára eltöltött idő
  • FGC - A teljes GC száma
  • FGCT - A teljes GC-kre fordított idő
  • CGC - Az egyidejűleg érkező GC-k száma
  • CGCT - Egyidejű GC-kre fordított idő
  • GCT - Az összes GC számára eltöltött idő

A memóriához más opciók is tartoznak jstat mint például:

  • A -kapacitás a különböző memóriaterületek különböző kapacitásának jelentésére
  • A -gcutil csak az egyes régiók kihasználtsági százalékát mutatja
  • A -gccause ugyanaz mint -gcutil de hozzáadja az utolsó GC és esetleg a jelenlegi GC események okát

4. Parancssori műveletek

Ha futtatunk egy Java alkalmazást halom konfigurációs lehetőségekkel (például -Xms és -Xmx), majd van még néhány trükk a megadott értékek megtalálásához.

Például, itt van, hogyan jps jelenti ezeket az értékeket:

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

Ezzel a megközelítéssel csak ezeket a statikus értékeket találhatjuk meg. Tehát nincs mód tudni mondjuk a jelenlegi elkötelezett memóriáról.

Továbbá jps, néhány más eszköz ugyanerről fog beszámolni. Például a „Jcmd VM.command_line” ezeket a részleteket is közölni fogja:

$ jcmd 4309 VM.command_line 4309: VM érvek: jvm_args: -Xms200m -Xmx1g java_command: quarkus.jar java_class_path (kezdeti): quarkus.jar Indító típusa: SUN_STANDARD

Ezenkívül a legtöbb Unix-alapú rendszeren tudjuk használni ps tól procps csomag:

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

Végül Linuxon használhatjuk a / proc virtuális fájlrendszer és annak pid fájljai:

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

A cmdline A Quarkus pid nevű könyvtárban található fájl tartalmazza az alkalmazás parancssori bejegyzését.

5. Következtetés

Ebben a gyors bemutatóban néhány különböző módszert láttunk a futó Java-alkalmazások halomméretének megszerzéséhez.