Come prendere in modo affidabile i dump di heap Java?


9

La mia squadra sta incontrando difficoltà quando provo a prendere buoni dump dell'heap innescati da OutOfMemoryErrors. Per motivi specifici stiamo attualmente prendendo i dump con jmap chiamato da uno script bash invece di usare il flag HeapDumpOnOutOfMemoryError. Stiamo utilizzando un JVM 1.6 a 64 bit con una dimensione heap di circa 3 GB. Le nostre discariche di heap falliscono il 90% delle volte (ipotesi).

C'è qualcosa che possiamo fare per migliorare le nostre probabilità di ottenere un dump dell'heap pulito che possiamo usare per risolvere i problemi di memoria? Ho letto che jmap aveva grossi problemi in Java 1.4 ma che ora dovrebbero essere risolti principalmente.


4
Nomino questa domanda per "il suono più disgustosamente involontario".
phoebus,

1
Hah- Ho pensato di renderlo intenzionalmente disgustoso, ma sono nuovo qui e non ero sicuro di come la community lo avrebbe preso :).
karlcyr,

Risposte:


7

Qual è il tuo sistema operativo? (Non riesco ad aggiungere commenti).

Per Solaris otteniamo risultati migliori forzando prima un core dump ( gcore <pid>) e quindi allegando jmap al file dump principale ( jmap -heap:format=b <path to java bin> <path to core>)

gcoreè un'utilità * nix per generare un'immagine di un programma in esecuzione. Vedi link .


provato con gdb su Linux e funziona benissimo.
Christian

quale JDK ha "gcore"? il mio, Sun 32 bit jdk per Linux 1.6.0.20 non ce l'ha.
Djangofan,

A cura di chiarimenti gcore.
fglez,

2

abbiamo un JSP che interroga ManagementFactory.getThreadMXBean () e produce un rapporto. Potrebbe non essere utile quando l'app si è arrestata in modo anomalo, ma se esegui il polling ogni minuto o giù di lì, avrai un'idea di ciò che sta accadendo.

Maggiori informazioni qui.


2

è possibile monitorare l'applicazione tramite jmx dall'esterno. quando conosci alcune metriche che indicano un OutOfMemory in arrivo, puoi attivare una corsa jmap prima che venga generata l'eccezione.


Grazie Christian- è più probabile che jmap sia affidabile prima che l'errore venga generato?
karlcyr,

jmap avrà ancora bisogno di un po 'di tempo per procurarti un dump dell'heap. ma otterrai un heapdump completo fintanto che il tuo jvm / tomcat è principalmente responsabile.
Christian,

Penso che lo strumento più semplice e pulito per farlo sia "Visual VM". Potrebbe essere al di fuori dell'ambito, ma creare un plug-in personalizzato per VisualVM che rilevi la condizione e prende il dump automatico da VisualVm sarebbe fantastico.
Djangofan,

2

Grazie a tutti per i vostri suggerimenti.

Ciò che abbiamo concluso è scrivere una sceneggiatura per monitorare attivamente i registri della raccolta dei rifiuti. Nella nostra esperienza, i GC completi back-to-back precedono quasi sempre una OOM, quindi il nostro script rileva questo evento, rimuove con garbo il server dal pool di bilanciamento del carico e forza il dump dell'heap. Ciò ha notevolmente aumentato la nostra efficacia.


2

Questa è una domanda abbastanza vecchia, ma darò una risposta con la speranza che qualcuno possa trovarla utile.

jmap ha un'opzione -F (force). Questo ha dimostrato di non funzionare così bene in passato per me. Se si desidera utilizzare l'opzione -F, si consiglia di specificare anche la directory java.io.tmp come parte del comando jmap. Si è verificato un problema con JVM versione 1.6.22 in cui l'utilità jmap non funzionava correttamente a causa di un'impostazione della directory temporanea.

Puoi anche provare a eseguire un dump principale tramite gdb. Una volta che hai il core, jmap può convertirlo in un dump dell'heap.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.