jmapvs. jmap -F, così come jstackvs. jstack -Futilizzare meccanismi completamente diversi per comunicare con la JVM di destinazione.
jmap / jstack
Quando si esegue senza -Fquesti strumenti, utilizzare il meccanismo di collegamento dinamico . Funziona come segue.
Prima di connettersi al processo Java 1234, jmapcrea un file .attach_pid1234nella directory di lavoro del processo di destinazione o in /tmp.
Quindi jmapinvia SIGQUITal processo di destinazione. Quando JVM cattura il segnale e lo trova .attach_pid1234, avvia il AttachListenerthread.
AttachListenerthread crea un socket di dominio UNIX /tmp/.java_pid1234per ascoltare i comandi da strumenti esterni.
Per motivi di sicurezza quando una connessione (da jmapè accettato), verifica JVM che le credenziali di peer presa sono pari a euide egiddi processo JVM. Ecco perché jmapnon funzionerà se eseguito da un utente diverso (anche da root).
jmapsi connette al socket e invia il dumpheapcomando.
Questo comando viene letto ed eseguito dal AttachListenerthread della JVM. Tutto l'output viene restituito al socket. Poiché il dump dell'heap viene eseguito direttamente da JVM, l'operazione è molto veloce. Tuttavia, JVM può farlo solo nei safepoint . Se non è possibile raggiungere un safepoint (ad esempio, il processo è bloccato, non risponde o è in corso un GC lungo), si jmapverificherà un timeout e non verrà eseguito correttamente .
Riassumiamo i vantaggi e gli svantaggi di Dynamic Attach.
Professionisti.
- Il dump dell'heap e altre operazioni vengono eseguite in collaborazione da JVM alla massima velocità.
- È possibile utilizzare qualsiasi versione di
jmapo jstackper connettersi a qualsiasi altra versione di JVM.
Contro.
- Lo strumento dovrebbe essere eseguito dallo stesso utente (
euid/ egid) della JVM di destinazione.
- Può essere utilizzato solo su JVM live e in buona salute.
- Non funzionerà se viene avviata la JVM di destinazione
-XX:+DisableAttachMechanism.
jmap -F / jstack -F
Quando viene eseguito con -Fgli strumenti, passare alla modalità speciale che include HotSpot Serviceability Agent . In questa modalità il processo di destinazione è congelato; gli strumenti leggono la sua memoria tramite le funzionalità di debug del sistema operativo, ovvero ptracesu Linux.
jmap -Finvoca PTRACE_ATTACHsulla JVM di destinazione. Il processo target viene sospeso incondizionatamente in risposta al SIGSTOPsegnale.
Lo strumento legge la memoria JVM utilizzando PTRACE_PEEKDATA. ptracepuò leggere solo una parola alla volta, quindi sono necessarie troppe chiamate per leggere il grande mucchio del processo di destinazione. Questo è molto e molto lento.
Lo strumento ricostruisce le strutture interne della JVM in base alla conoscenza della particolare versione della JVM. Poiché diverse versioni di JVM hanno un layout di memoria diverso, la -Fmodalità funziona solo se jmapproviene dallo stesso JDK del processo Java di destinazione.
Lo strumento crea esso stesso il dump dell'heap e quindi riprende il processo di destinazione.
Professionisti.
- Non è richiesta la collaborazione della JVM di destinazione. Può essere utilizzato anche su un processo sospeso.
ptracefunziona ogni volta che i privilegi a livello di sistema operativo sono sufficienti. Ad esempio, rootpuò eseguire il dump dei processi di tutti gli altri utenti.
Contro.
- Molto lento per grandi cumuli.
- Lo strumento e il processo di destinazione dovrebbero provenire dalla stessa versione di JDK.
- Il safepoint non è garantito quando lo strumento si collega in modalità forzata. Sebbene
jmapcerchi di gestire tutti i casi speciali, a volte può accadere che la JVM di destinazione non sia in uno stato coerente.
Nota
C'è un modo più veloce per eseguire i dump dell'heap in modalità forzata. Innanzitutto, crea un coredump con gcore, quindi esegui jmapil file core generato. Vedi la domanda correlata .