Kommandolinjeverktøy for å finne Java Heap-størrelse

1. Oversikt

I denne raske opplæringen skal vi bli kjent med noen forskjellige måter å få massestørrelsen til et Java-program som kjører.

2. jcmd

For å finne informasjon om heap og metaspace for et Java-program som kjører, kan vi bruke jcmd kommandolinjeverktøy:

jcmd GC.heap_info

La oss først finne prosess-ID-en til et bestemt Java-program ved hjelp av jps kommando:

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

Som vist ovenfor er prosess-ID-en for Quarkus-applikasjonen vår 4309. Nå som vi har prosess-ID, la oss se hauginformasjonen:

$ jcmd 4309 GC.heap_info 4309: søppel-første haug totalt 206848K, brukt 43061K regionstørrelse 1024K, 43 unge (44032K), 3 overlevende (3072K) Metaspace brukt 12983K, kapasitet 13724K, begått 13824K, reservert 1060864K klasse plass brukt 1599K, kapasitet 1740K, forpliktet 1792K, reservert 1048576K

Denne appen bruker G1 eller søppel-første GC-algoritmen:

  • Første linje rapporterer gjeldende haugestørrelse som 202 MB (206848 K) - også, 42 MB (43061 K) blir brukt
  • G1-regioner er 1 MB, det er 43 regioner merket som unge, og 3 som overlevende plass
  • Den nåværende kapasiteten til metaspace er rundt 13,5 MB (13724 K). Fra 13,5 MB brukes rundt 12,5 MB (12983 K). Vi kan også ha opptil 1 GB metaspace (1048576 K). Videre garanterte 13842 KB å være tilgjengelig for bruk av den virtuelle Java-maskinen, også kjent som dedikert minne
  • Den siste linjen viser hvor mye av metaspace som brukes til å lagre klasseinformasjon

Denne utgangen kan endres avhengig av GC-algoritmen. For eksempel hvis vi kjører den samme Quarkus-appen med ZGC via “-XX: + UnlockExperimentalVMOptions -XX: + UseZGC”:

ZHeap brukt 28M, kapasitet 200M, maks kapasitet 1024M Metaspace brukt 21031K, kapasitet 21241K, forpliktet 21504K, reservert 22528K

Som vist ovenfor bruker vi 28 MB av haugen og rundt 20 MB metaspace. I skrivende stund bruker Intellij IDEA fortsatt CMS GC med følgende bunkeinfo:

par ny generasjon totalt 613440K, brukt 114299K eden plass 545344K, 18% brukt fra verdensrommet 68096K, 16% brukt til space 68096K, 0% brukt samtidig mark-sweep generasjon totalt 1415616K, brukt 213479K Metaspace brukt 423107K, kapasitet 439976K, forpliktet 440416K, reservert 1429504K brukt klasserom 55889K, kapasitet 62488K, forpliktet 62616K, reservert 1048576K

Vi kan se den klassiske generasjonsegenskapen til CMS GC i haugkonfigurasjonen.

3. jstat

I tillegg til jcmd, Vi kan bruke jstat for å finne ut den samme informasjonen fra applikasjoner som kjører. For eksempel kan vi bruke jstat -gc for å se haugstatistikk:

$ 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

Hver kolonne representerer minnekapasiteten eller bruken av et bestemt minneområde:

  • S0C - Kapasiteten for det første overlevende rommet
  • S1C - Kapasiteten for det andre overlevende rommet
  • S0U - Den brukte plassen til den første overlevende
  • S1U - Den brukte plassen til den andre overlevende
  • EC - Eden plasskapasitet
  • EU - Brukt plass fra Eden
  • OC - ​​Gammel generasjonskapasitet
  • OU - Brukt plass fra gammel generasjon
  • MC - Metaspace kapasitet
  • MU - Brukt plass fra Metaspace
  • CCSC - Komprimert klassekapasitet
  • CCSU - Brukt plass til komprimerte klasser
  • YGC - Antall mindre GC-er
  • YGCT - Tiden brukt for mindre GC
  • FGC - Antall fulle GC-er
  • FGCT - Tiden brukt for fulle GC-er
  • CGC - Antall samtidige GC-er
  • CGCT - Tid brukt på samtidig GC
  • GCT - Tiden brukt for alle GC-ene

Det er andre hukommelsesrelaterte alternativer for jstat som for eksempel:

  • De -gccapacity å rapportere forskjellige kapasiteter for forskjellige minnesregioner
  • De -gcutil viser bare utnyttelsesprosenten i hver region
  • -Gccause er det samme som -gcutil men legger til årsaken til den siste GC og muligens nåværende GC-hendelser

4. Kommandolinjearg

Hvis vi kjører et Java-program med opsamlingsalternativer for heap (for eksempel -Xms og -Xmx), så er det noen få andre triks for å finne de angitte verdiene.

For eksempel, her er hvordan jps rapporterer disse verdiene:

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

Med denne tilnærmingen kan vi bare finne disse statiske verdiene. Så det er ingen måte å vite om, for eksempel, det nåværende engasjerte minnet.

I tillegg til jps, noen få andre verktøy vil rapportere det samme. For eksempel “Jcmd VM.command_line” vil også rapportere disse detaljene:

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

På de fleste Unix-baserte systemer kan vi også bruke ps fra rekvisitter pakke:

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

Til slutt, på Linux, kan vi bruke / proc virtuelt filsystem og dets pid-filer:

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

De cmdline filen, i en katalog oppkalt etter Quarkus pid, inneholder kommandolinjeposten for applikasjonen.

5. Konklusjon

I denne raske opplæringen så vi noen forskjellige måter å få takstørrelsen til et Java-program som kjører.


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