Kommandolinjeværktøjer til at finde Java Heap-størrelse

1. Oversigt

I denne hurtige vejledning bliver vi fortrolige med et par forskellige måder at få bunkestørrelsen på en kørende Java-applikation.

2. jcmd

For at finde heap- og metaspace-relaterede oplysninger om en kørende Java-applikation kan vi bruge jcmd kommandolinjeværktøj:

jcmd GC.heap_info

Lad os først finde proces-id'et for et bestemt Java-program ved hjælp af jps kommando:

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

Som vist ovenfor er proces-id'et til vores Quarkus-applikation 4309. Nu hvor vi har proces-id'et, lad os se bunkeinfoen:

$ jcmd 4309 GC.heap_info 4309: skrald-første bunke i alt 206848K, brugt 43061K region størrelse 1024K, 43 unge (44032K), 3 overlevende (3072K) Metaspace brugt 12983K, kapacitet 13724K, begået 13824K, reserveret 1060864K klasse plads brugt 1599K, kapacitet 1740K, begået 1792K, reserveret 1048576K

Denne app bruger G1 eller skrald-første GC-algoritmen:

  • Den første linje rapporterer den aktuelle bunke størrelse som 202 MB (206848 K) - også 42 MB (43061 K) bliver brugt
  • G1-regioner er 1 MB, der er 43 regioner markeret som unge og 3 som overlevende plads
  • Den nuværende kapacitet på metaspace er omkring 13,5 MB (13724 K). Fra disse 13,5 MB bruges omkring 12,5 MB (12983 K). Vi kan også have op til 1 GB metaspace (1048576 K). Desuden garanterede 13842 KB at være tilgængelig til brug af den virtuelle Java-maskine, også kendt som dedikeret hukommelse
  • Den sidste linje viser, hvor meget af metrummet der bruges til at gemme klasseoplysninger

Denne output kan ændre sig afhængigt af GC-algoritmen. For eksempel, hvis vi kører den samme Quarkus-app med ZGC via “-XX: + UnlockExperimentalVMOptions -XX: + UseZGC”:

ZHeap brugt 28M, kapacitet 200M, maks. Kapacitet 1024M Metaspace brugt 21031K, kapacitet 21241K, begået 21504K, reserveret 22528K

Som vist ovenfor bruger vi 28 MB af bunken og omkring 20 MB metaspace. I skrivende stund bruger Intellij IDEA stadig CMS GC med følgende bunkeinfo:

par ny generation i alt 613440K, brugt 114299K eden plads 545344K, 18% brugt fra plads 68096K, 16% brugt til plads 68096K, 0% brugt samtidig mark-sweep generation i alt 1415616K, brugt 213479K Metaspace brugt 423107K, kapacitet 439976K, begået 440416K, reserveret 1429504K brugt klasse plads 55889K, kapacitet 62488K, begået 62616K, reserveret 1048576K

Vi kan se den klassiske generation af CMS GC i bunkkonfigurationen.

3. jstat

I tillæg til jcmd, vi kan bruge jstat for at finde ud af de samme oplysninger fra kørende applikationer. For eksempel kan vi bruge jstat -gc for at se bunke-statistikker:

$ 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 repræsenterer hukommelseskapacitet eller udnyttelse af et bestemt hukommelsesområde:

  • S0C - Kapaciteten til det første overlevende rum
  • S1C - Kapaciteten til det andet overlevende rum
  • S0U - Den brugte plads for den første overlevende
  • S1U - Den anden overlevendes brugte plads
  • EC - Eden plads kapacitet
  • EU - Brugt rum fra Eden
  • OC - ​​Gammel generationskapacitet
  • OU - Brugt plads fra den gamle generation
  • MC - Metaspace kapacitet
  • MU - Brugt plads fra Metaspace
  • CCSC - Komprimeret klasse plads kapacitet
  • CCSU - Brugt plads til komprimerede klasser
  • YGC - Antallet af mindre GC'er
  • YGCT - Tiden brugt til mindre GC'er
  • FGC - Antallet af fulde GC'er
  • FGCT - Tiden brugt til fulde GC'er
  • CGC - Antallet af samtidige GC'er
  • CGCT - Tid brugt på samtidige GC'er
  • GCT - Tiden brugt for alle GC'er

Der er andre hukommelsesrelaterede muligheder for jstat såsom:

  • Det -gkapacitet at rapportere forskellige kapaciteter for forskellige hukommelsesregioner
  • Det -gcutil viser kun udnyttelsesprocenten for hver region
  • -Gccause er det samme som -gcutil men tilføjer årsagen til den sidste GC og muligvis aktuelle GC-begivenheder

4. Kommandolinjearg

Hvis vi kører en Java-applikation med heap-konfigurationsindstillinger (for eksempel -Xms og -Xmx), så er der et par andre tricks til at finde de angivne værdier.

For eksempel, her er hvordan jps rapporterer disse værdier:

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

Med denne tilgang kan vi kun finde disse statiske værdier. Så der er ingen måde at vide om f.eks. Den aktuelle hukommelse.

I tillæg til jps, et par andre værktøjer rapporterer det samme. F.eks “Jcmd VM.command_line” vil også rapportere disse detaljer:

$ 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

Også på de fleste Unix-baserede systemer kan vi bruge ps fra rekvisitter pakke:

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

Endelig på Linux kan vi bruge / proc virtuelt filsystem og dets pid-filer:

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

Det cmdline -fil, i en mappe opkaldt efter Quarkus pid, indeholder kommandolinjeposten til applikationen.

5. Konklusion

I denne hurtige vejledning så vi et par forskellige måder at få bunkestørrelsen på en kørende Java-applikation.


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