2012-05-21 15 views
6

Próbuję napisać po prostu klasę ObjectUtils zawierającą różne metody użytkowe dla wszystkich obiektów. Chciałbym mieć jeden z nich nazywa getObjectSize(Object) gdzie przekazać mu instancja Object i zwraca rozmiar obiektu w pamięci:Jak uzyskać instancję oprzyrządowania w Javie

public class ObjectUtils { 
    private static volatile Instrumentation instrumentation; 

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

Wydaje się jednak, że w celu uzyskania wdrożony Instrumentation instancji, trzeba rób różne fantazyjne rzeczy za pomocą agentów JRE i tak zwaną metodę premain.

Czy istnieje łatwy sposób uzyskania dostępu do lokalnych instancji JRE Instrumentation? Szukałem czegoś przez interfejs API Runtime, ale nic nie mogłem znaleźć.

+2

Ja myślę, że nie ma. Będziesz musiał zrobić fantazyjne rzeczy. –

+0

Odkopałem ten post od Alexa Snapsa, który może ci się przydać: http://www.codespot.net/blog/2012/01/measuring-java-object-sizes/ –

Odpowiedz

0

Znalazłem klasę o nazwie InstrumentationFactory.

Po raz pierwszy ktoś prosi o wystąpienie Instrumentation, tworzy plik JAR agenta, a następnie znajdzie PID własnym procesie i przywiązuje go do wewnątrz JVM, że ... Który nazywa swoją agentmain(..), nadając mu Instrumentation wystąpienie zainteresowania.

Nie jestem pewien, jak wiarygodne jest to podejście. Następnie spróbuję wyszukać kod OpenJDK, aby zobaczyć, gdzie i jak tworzona jest instancja Instrumentation. Być może, w przypadku braku wymagań bezpieczeństwa, byłoby możliwe (poprzez odbicie) uzyskanie tego mechanizmu dostarczenia instancji Instrumentation bez konieczności dołączania lub wstępnego ładowania agenta?

Powiązane problemy