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.