2009-11-30 10 views
12

Ho bisogno di un modo per richiedere un dump di heap dall'interno dell'applicazione.Richiedi java heap dump (core dump) dall'interno dell'applicazione

Razionale: Quando si verifica una condizione di errore specifica, mi piacerebbe eseguire il dump dello heap, in modo da poter vedere cosa sta trattenendo nella memoria.

Ma vorrei automatizzarlo (ad esempio, quando rilevo che si è verificata una condizione specifica o quando un watchdog non riceve più i suoi ping. Quindi ho bisogno di un modo per scaricare l'heap dall'applicazione stessa. Non riesco a trovarlo con la roba dei fagioli MX. Sebbene gli MX Beans possano fornire tracce di stack molto belle con informazioni su monitor e "ownable synchronizer", informazioni su deadlock e contesa, non riesco a trovare un modo per richiedere un dump dell'heap. C'è qualche modo? O con alcuni mezzi indiretti, ad esempio, come fanno queste cose su JVisualVM? E si può dire alla JVM di scaricare core su OutOfMemoryExceptions ..?

risposta

16

Se non è sufficiente per dump heap on OutOfMemoryError, esiste un modo dipendente da HotSpot di programmatically dumping heap from Java applications, se questo è OK.

+0

Fantastico, proprio quello che stavo cercando, grazie! Trovo incredibile che non ho trovato quel post sul blog durante il mio googling. Sotto sun.management, ci sono apparentemente un sacco di divertimento! – stolsvik

+0

Un altro commento, comunque (tornando alle idee postate nell'OP): Dal tuo "dump heap su OutOfMemoryError" link, posso leggere: "Il dump dell'heap incorporato può anche essere usato per fare uno snapshot dell'heap a altre volte, utilizzando l'utilità della riga di comando jmap o la console di monitoraggio e gestione di jconsole. ". Questi strumenti probabilmente usano l'MXBean proprietario a cui si riferisce il secondo link? Trovo strano che gli standard MX-bean non abbiano questo metodo dumpHeap (fileName, live). – stolsvik

+0

Una sorta di fastidioso, sì, ma suppongo che fosse una funzionalità standard, anche il formato heap dump dovrebbe essere standardizzato. Per lo meno, immagino che sarebbe molto lavoro, e potrebbe limitare i venditori di libertà nelle loro implementazioni VM. – gustafc

4

Che dire dell'utilizzo dell'opzione VM -XX:+HeapDumpOnOutOfMemoryError per dire alla macchina virtuale HotSpot di generare un dump dell'heap quando esaurisce la memoria?

+0

+1: l'unica "condizione di errore specifica" in cui l'OP può ragionevolmente sapere che qualcosa sta trattenendo memoria, è un OutOfMemoryError; nel qual caso lo scarico di heap a questo punto fornisce la discarica dell'heap desiderata. –

+0

@Andrzej: Perché dovrebbe essere l'unica condizione di errore "ragionevole"? Esistono molti modi per capire quale sia la situazione di memoria di una VM dall'interno, ad es. WeakReference, controllando i contatori di memoria dei bean Runtime ed MX ecc (prima e dopo System.gc()) - boatloads. JProfiler ha funzionato, ma volevo una soluzione programmatica, non JProfiler. Ecco un altro ragazzo il cui problema posso riguardare: http://www.velocityreviews.com/forums/t275440-dump-complete-java-vm-state-as-core-dump-not-via-os-possible.html I scommetto che avrebbe amato la soluzione che mi è stata data qui! – stolsvik