2012-05-21 10 views
6

Sto provando a scrivere una semplice classe ObjectUtils che contiene una varietà di metodi di utilità per tutti gli oggetti. Mi piacerebbe avere uno di loro chiama getObjectSize(Object) dove si passa un oggetto istanziato e restituisce le dimensioni dell'oggetto in memoria:Come ottenere l'istanza di Instrumentation in Java

public class ObjectUtils { 
    private static volatile Instrumentation instrumentation; 

    public static final long getObjectSize(final Object p_oToGauge) 
    { 
     return instrumentation.getObjectSize(p_oToGauge); 
    } 
} 

Tuttavia, sembra che, al fine di ottenere un implementato Instrumentation esempio, è necessario fare ogni sorta di cose di fantasia con gli agenti JRE e il cosiddetto metodo premain.

Esiste un modo semplice per accedere alle istanze JRE locali Instrumentation? Ho cercato qualcosa tramite l'API Runtime ma non ho trovato nulla.

+2

I _think_ non c'è. Dovrai fare le cose fantasiose. –

+0

Ho tirato fuori questo post da Alex Snaps che potresti trovare utile: http://www.codespot.net/blog/2012/01/measuring-java-object-sizes/ –

risposta

0

Ho trovato una classe chiamata InstrumentationFactory.

La prima volta che qualcuno chiede per un'istanza di Instrumentation, si crea un file JAR agente, poi trova il PID del proprio processo e lo collega alla JVM dentro che ... che chiama il suo agentmain(..), dandogli il Instrumentation istanza di interesse.

Non sono sicuro di quanto sia affidabile tale approccio. Quello che proverei dopo è cercare il codice di OpenJDK per vedere dove e come viene creata un'istanza Instrumentation. Forse, in assenza di requisiti di sicurezza, sarebbe possibile (tramite riflessione) ottenere quel meccanismo per fornire un'istanza Instrumentation senza dover allegare o precaricare un agente?

Problemi correlati