Tracciamento di allocazione del heap consapevole con jvmti
Domanda
Scrivere un profilo Implementerei anche il tipico compito di profilazione del mucchio. In particolare vorrei tracciare, quale thread ha assegnato quanti dati? Usando jvmti ho pensato che fosse sufficiente agganciare agli eventi Allocazione degli oggetti VM e Oggetto libero. Purtroppo ho letto che il primo evento non è attivato a causa delle chiamate fatte a new
.
L'ultima idea che ho avuto è stata controllare l'evento Metodoxit Se il suo nome è <init>
e quindi dichiarare questa chiamata come un'allocazione degli oggetti. Tuttavia, all'interno di questo evento non riesco a ottenere l'oggetto e quindi non posso invocare GetObjectSize
.
Semplicemente iterato sul heap, non ha informazioni su quale oggetto è stato assegnato da quale thread. Qualcuno ha un'idea di come implementarlo?
Soluzione
C'è qualche motivo per cui non puoi chiamare GetObjectSize
dal MethodEntry
Evento per un costruttore?
Se sei interessato a eseguire il codice prima che un metodo torni, puoi ascoltare il MethodEntry
evento, e se il metodo viene nominato <init>
, Puoi chiamare NotifyFramePop
per ascoltare il FramePop
Evento per il frame corrente. Questo evento è simile al MethodExit
evento, ma si verifica prima che il metodo ritorni in modo da poter comunque ottenere il this
oggetto.
Altri suggerimenti
Una rapida occhiata all'implementazione _New dell'hotspot VM (templateTable_x86_64.cpp) sembra indicare che _new non offre alcun gancio per jvmti (nemmeno nel caso lento sembra). Quindi, se il tuo trucco non funziona, non vedo altre possibilità, ma non sono affatto un esperto di JVMTI.
Presumo che compilare la tua VM hotspot con una piccola patch non sia particolarmente utile per te?
Questo demo di heaptracker Ti illustra come tracciare tutti gli oggetti nel mucchio. Perché il Evento VMObjectAlloc viene inviato solo quando si verifica la riflessione, la demo utilizza bytecodeInstrument per tracciare la nuova allocazione degli oggetti.
È possibile utilizzare la funzione getCurrentThread per sapere a quale thread è l'oggetto appartenente.