2012-05-21 2 views
6

Я пытаюсь написать просто класс ObjectUtils, который содержит множество методов утилиты для всех объектов. Я хотел бы иметь один из них называется getObjectSize(Object), где вы передаете ему экземпляр объекта и возвращает размер объекта в памяти:Как получить экземпляр инструментария в Java

public class ObjectUtils { 
    private static volatile Instrumentation instrumentation; 

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

Тем не менее, кажется, что для того, чтобы получить реализованный Instrumentation экземпляр, вам нужно делать всевозможные причудливые вещи с помощью агентов JRE и так называемый метод premain.

Есть ли простой способ получить доступ к локальным экземплярам JRE Instrumentation? Я искал что-то через API Runtime, но ничего не мог найти.

+2

I _think_ нет. Тебе придется делать причудливые вещи. –

+0

Я откопал это сообщение от Alex Snaps, что может показаться вам полезным: http://www.codespot.net/blog/2012/01/measuring-java-object-sizes/ –

ответ

0

Я нашел класс под названием InstrumentationFactory.

В первый раз кто-то просит экземпляр Instrumentation, он создает файл JAR агента, а затем находит PID своего собственного процесса и присоединяет его к JVM в том, что ... Который называет его agentmain(..), придавая ему Instrumentation пример интереса.

Я не уверен, насколько это надежный подход. То, что я попробую, это поиск кода OpenJDK, чтобы узнать, где и как создается экземпляр Instrumentation. Возможно, при отсутствии требований безопасности было бы возможно (через отражение) получить этот механизм для предоставления экземпляра Instrumentation без необходимости прикреплять или предварительно загружать агента?