Java >> Java tutorial >  >> JVM

Stoppes en JVM, mens jmap udføres?

Din ansøgning er stoppet. Den eneste praktiske måde at få et nøjagtigt heap-dump på ville være at stoppe al applikationsaktivitet, mens dumpet oprettes.

Om dette er en "kort" pause eller en "lang" pause afhænger af, hvor meget der dumpes. Hvis du bruger "-dump", vil du dumpe hele bunken, inklusive uopnåelige objekter. Hvis du bruger "-dump:live" vil du kun dumpe objekter, der kan nås ... men det indebærer også (i det mindste) at markere bunken for at finde ud af, hvilke objekter der er tilgængelige.

Men hvis du dumper en bunke på størrelse med en gigabyte, skal du forvente, at pausetiden bliver målt i minutter i stedet for sekunder.

Med hensyn til forslaget om, at du kunne undgå at stoppe JVM'en ved at bruge gaffel, viser det sig, at forgrening af en flertrådsproces kan være problematisk:

  • gaffel i flertrådet program
  • Flertrådsgaffel
  • http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them

Så er der problemet med ressourceforbruget.


Jeg havde et problem med at prøve at gøre dette på en produktionsmaskine, der oprettede hprof-filen med jmap, tog evigheder og låste naturligvis java-webappen i evigheder.

Jeg fandt denne side:

http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/

Hvilket forklarede, at du også kan bruge gdb (på linux-systemer) til at dumpe kernen af ​​java-processen.

Med denne kernefil kan du så generere hprof-filen til analyse i en separat proces, som forhindrer din java-serverproces i at blive afbrudt i så lang tid. Hvilket er, hvad der ville ske, hvis du skulle køre den samme operation med jmap.

For at opsummere:

download og installer gdb

apt-get update

apt-get install gdb

...

få java-proces-id'et for den java-proces, du er interesseret i

jps...

start en gdb-session med den proces

gdb [pid]...

generer derefter kernefilen:

gcore /tmp/jvm.core

afslutte gdb-sessionen

frigøres

brug derefter den genererede kernefil til at lave en hprof-fil:

sudo jmap -dump:format=b,file=jvm.hprof /usr/bin/java /tmp/jvm.core

derefter (g)zip filen op og kopier den til din maskine for yderligere analyse.


Jeg vil sige, at dit program pauser kort, mens hukommelsesdumpen tages. Hukommelsesdumpet er et øjebliksbillede af dit kørende program, så jmap bliver nødt til at låse JVM'en kort, mens hukommelsen læses. At sende dump-filen tilbage til klienten kan dog gøres i en separat tråd, hvorved pausen minimeres.


Java tag