2011-09-06 23 views
5

Se voglio realizzare un profiler utilizzando il codice di byte strumentazione, dovrei scrivere un agente nativo utilizzando JVMTI o dovrei scrivere un agente java usando il pacchetto java.lang.instrument?Strumentazione del codice a byte - implementa l'agente nativo o java?

Se voglio usare librerie come ASM - che sembra essere obbligatorio se si desidera creare un serio profiler - devo usare un agente di Java. Il che mi confonde, dal momento che pensavo che un agente nativo possa fare tutto ciò che può fare un agente Java e altro ancora. Ma per me, sembra più facile scrivere un agente java.

Ci sono alternative? Si dovrebbe comunque utilizzare l'agente java e l'agente nativo?

risposta

5

Quasi tutti scrivono un agente java (con ASM o BCEL) poiché non vogliono dover scrivere uno strumento bytecode C/C++ da zero in quanto non sono disponibili pubblicamente.

Quello che non sarà in grado di fare è strumento e profilo/monitoraggio della JVM primordiale e l'accesso alle funzioni native richiede chiamate JNI. Ci sono anche diverse chiamate JVMTI che potrebbero non essere disponibili (se la memoria serve).

ho scritto il mio instrumentor in C diversi anni fa, e sono in procinto di scriverne uno nuovo che spero di open source (a seconda dei miei signori del male :-))

Come su un casa a metà strada, una JVM separata pre-avviata a cui il tuo agente nativo invia bytecode. In quella JVM, il tuo facile pisello per scrivere uno strumento basato su ASM fa il duro lavoro e invia il bytecode risultante all'agente nativo sul filo. Sì, sembra un po 'complicato ma è più facile scrivere la tua libreria BCI.

+1

Cosa intendi con JVM pre-avviato? Includerebbe due JVM? Uno per la profilazione e uno che esegue l'applicazione effettiva? Perché l'agente nativo dovrebbe inviare bytecode? Ho pensato che fosse qualcosa che dovremmo evitare. –

Problemi correlati