2012-05-21 21 views
6

Estoy tratando de escribir una clase simplemente ObjectUtils que contiene una variedad de métodos de utilidad para todos los objetos. Me gustaría tener uno de ellos llamó getObjectSize(Object) donde se le pasa una instancia de objeto y se devuelve el tamaño del objeto en la memoria:Cómo obtener una instancia de Instrumentación en Java

public class ObjectUtils { 
    private static volatile Instrumentation instrumentation; 

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

Sin embargo, parece que con el fin de obtener una implementado Instrumentation ejemplo, es necesario hacer todo tipo de cosas sofisticadas con los agentes de JRE y un método llamado premain.

¿Hay una manera fácil de obtener acceso a las instancias locales de JRE Instrumentation? Busqué algo a través de la API Runtime pero no pude encontrar nada.

+2

I _think_ there is not. Tendrás que hacer las cosas elegantes. –

+0

Saqué esta publicación de Alex Snaps que podría serle útil: http://www.codespot.net/blog/2012/01/measuring-java-object-sizes/ –

Respuesta

0

Encontré una clase llamada InstrumentationFactory.

La primera vez que alguien pide una instancia de Instrumentation, crea un archivo JAR agente, a continuación, busca el PID de su propio proceso y se une a la JVM que el interior ... Lo que llama su agentmain(..), dándole el Instrumentation instancia de interés.

No estoy seguro de cuán confiable es este enfoque. Lo que probaría a continuación es buscar el código de OpenJDK para ver dónde y cómo se crea una instancia de Instrumentation. Quizás, en ausencia de requisitos de seguridad, sería posible (a través de la reflexión) lograr que ese mecanismo proporcione una instancia Instrumentation sin tener que adjuntar o precargar un agente.

Cuestiones relacionadas