2014-12-03 10 views
18

Tutti sanno che è possibile ottenere un dump dell'heap da una JVM in esecuzione. L'altro modo è possibile? Possiamo avviare una JVM usando un dump dell'heap?È possibile creare un'istanza di jvm da un dump dell'heap?

Ho avuto questa domanda in mente da molto tempo. Se questo è possibile, risolverebbe molto tempo e renderà la cosa facile per un tecnico di supporto. Aiuta molto tempo nei casi in cui se dobbiamo ricreare alcuni dei rari problemi che il nostro cliente deve affrontare. [Immaginate solo che l'hardware sottostante e il runtime Java siano gli stessi e anche tutti i file di supporto siano presenti nella rispettiva posizione nel file system].

Nota aggiunta: l'intenzione di eseguire questa operazione non è quando OOM si verifica ma in qualsiasi momento dopo l'avvio di JVM.

+0

Cosa chiedete implica tempo di inversione. Non è possibile Sorpreso che dovevi chiedere. – EJP

+0

Dato che non possiamo essere tutti consapevoli, penso che sia davvero una buona domanda. – Joeblade

risposta

1

Penso che stiate cercando strumenti come Java Mission Control e Chronon DVR (commerciale). Questi aiutano analisi degli incidenti, raccolta degli eventi e profilatura, debugging viaggio nel tempo (come formulata dal chronon)

Come da loro documentazione:

Java Mission Control

Java Flight Recorder e Missione Java Controllo insieme creare una catena di strumenti completa per raccogliere continuamente informazioni di runtime di livello basso e dettagliate che consentono l'analisi degli incidenti dopo il fatto. Java Flight Recorder è un framework di profilazione e raccolta eventi creato in Oracle JDK. Consente agli amministratori e sviluppatori Java di di raccogliere informazioni dettagliate di basso livello su come si comportano Java Virtual Macchina (JVM) e l'applicazione Java. Java Mission Control è un set avanzato di strumenti che consente un'efficiente analisi e l'analisi dettagliata di dell'ampio numero di dati raccolti dal registratore Java Flight . La catena strumento consente agli sviluppatori e agli amministratori di raccogliere e analizzare dati provenienti da applicazioni Java in esecuzione localmente o schierato in produzione environments.Starting con il rilascio di Oracle JDK 7 Aggiornamento 40 (7u40)

alcune caratteristiche chiave di Chronon server di registrazione che sarà utile nel vostro caso:

Il server di registrazione è specificamente progettato per una lunga corsa, applicazioni server di laterali che corrono per settimane o mesi alla volta. Il server di registrazione si occuperà di dividere la registrazione se ottiene troppo grande e sta scaricando vecchie registrazioni.

Sbarazzarsi del bisogno di guardare i file di log lunghi scarsamente dettagliati a eseguire il debug del programma. È sufficiente riprodurre l'intera esecuzione e vedere esattamente ciò che è avvenuto nel tuo programma. Il server di registrazione consente di condividere le registrazioni su diversi computer tra i membri del team o tra più team.

1

Per creare un dump dell'heap da una JVM in esecuzione è anche possibile utilizzare jhat o jcmd (con il comando GC.heap_dump), entrambi presenti nella cartella JDK/bin. MAT è un modo per analizzare i contenuti della discarica.Java Mission Control ha uno strumento chiamato JOverflow che analizza i dump dell'heap, ma solo per esaminare i modelli di spreco di memoria.

Non ho mai sentito di alcun modo per riavviare una JVM da una specie di immagine, un dump dell'heap non sarebbe affatto sufficiente, dal momento che contiene solo gli oggetti Java, e non il codice compilato e altre cose.

2

No non è possibile. Avresti bisogno di cose come la posizione corrente in ogni file aperto. Ciò influisce su quali dati vengono restituiti su una lettura sequenziale semplice. Il restauratore dovrebbe aprire ciascun file e portarlo nella posizione corretta. Ciò potrebbe non essere possibile per flussi non ricercabili.

La serializzazione specifica del programma è un percorso molto più fattibile, quindi impostare il programma da lì.

Inoltre, dal momento che i dump di heap sono di solito partiti da OutOfMemory, ricreare JVM dallo stesso genera nuovamente OutOfMemoryException. Se stai facendo il dump dell'heap in mezzo, serializza i tuoi oggetti e ripristinali quando fai apparire jvm.

(contenuti copiati da commenti di questa domanda, Autori almas-shaikh e patricia-shanahan)

+0

Un dump dell'heap viene creato quando si verifica un errore di memoria insufficiente, ma questo non è l'unico metodo per ottenerne uno. Questa risposta fa un'ipotesi sull'intento dell'autore. solo perché a -> b non significa b -> a – Joeblade

+0

Point non hai risposto alla loro domanda. (o meglio la tua prima riga è corretta ma non hai elencato perché/cosa, invece discuti una circostanza specifica che genera un dump che non sarebbe utile da ripristinare). Il secondo paragrafo penso sia sul punto, ma il primo non lo è. – Joeblade

Problemi correlati