jmap
vs. jmap -F
, così come jstack
vs. jstack -F
utilizzare meccanismi completamente diversi per comunicare con la JVM di destinazione.
jmap / jstack
Quando si esegue senza -F
questi strumenti, utilizzare il meccanismo di collegamento dinamico . Funziona come segue.
Prima di connettersi al processo Java 1234, jmap
crea un file .attach_pid1234
nella directory di lavoro del processo di destinazione o in /tmp
.
Quindi jmap
invia SIGQUIT
al processo di destinazione. Quando JVM cattura il segnale e lo trova .attach_pid1234
, avvia il AttachListener
thread.
AttachListener
thread crea un socket di dominio UNIX /tmp/.java_pid1234
per 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 euid
e egid
di processo JVM. Ecco perché jmap
non funzionerà se eseguito da un utente diverso (anche da root).
jmap
si connette al socket e invia il dumpheap
comando.
Questo comando viene letto ed eseguito dal AttachListener
thread 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 jmap
verificherà 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
jmap
o jstack
per 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 -F
gli 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 ptrace
su Linux.
jmap -F
invoca PTRACE_ATTACH
sulla JVM di destinazione. Il processo target viene sospeso incondizionatamente in risposta al SIGSTOP
segnale.
Lo strumento legge la memoria JVM utilizzando PTRACE_PEEKDATA
. ptrace
può 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 -F
modalità funziona solo se jmap
proviene 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.
ptrace
funziona ogni volta che i privilegi a livello di sistema operativo sono sufficienti. Ad esempio, root
può 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
jmap
cerchi 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 jmap
il file core generato. Vedi la domanda correlata .