2012-05-21 3 views
6

Ich versuche, eine einfache ObjectUtils Klasse zu schreiben, die eine Vielzahl von Hilfsmethoden für alle Objekte enthält. Ich möchte einer von ihnen getObjectSize(Object) genannt haben, wo man ihm ein instanzierte Objekt übergibt, und es gibt die Größe des Objekts im Speicher:So erhalten Sie Instanz von 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); 
    } 
} 

Allerdings scheint es, dass, um eine implementiertes Instrumentation Instanz zu erhalten, müssen Sie mache alle möglichen Dinge mit JRE-Agenten und einer sogenannten premain Methode.

Gibt es eine einfache Möglichkeit, Zugriff auf die lokalen JRE-Instanzen Instrumentation zu erhalten? Ich suchte über die API Runtime nach etwas, konnte aber nichts finden.

+2

Ich _think_ gibt es nicht. Du wirst die schicken Sachen machen müssen. –

+0

Ich habe diesen Artikel von Alex Snaps ausgegraben, den Sie vielleicht nützlich finden: http://www.codspot.net/blog/2012/01/measuring-java-object-sizes/ –

Antwort

0

Ich habe eine Klasse namens InstrumentationFactory gefunden.

Das erste Mal, wenn jemand für eine Instanz von Instrumentation fragt, erstellt er eine Datei-Agent JAR, dann ist die PID des eigenen Prozess findet und legt es in die JVM im Inneren, die ... ihre agentmain(..) nennt es die Instrumentation geben Instanz von Interesse.

Ich bin mir nicht sicher, wie zuverlässig dieser Ansatz ist. Was ich als nächstes versuchen würde, ist den Code von OpenJDK zu suchen, um zu sehen, wo und wie eine Instrumentation Instanz erstellt wird. Vielleicht wäre es in Ermangelung von Sicherheitsanforderungen möglich (durch Reflektion), diesen Mechanismus dazu zu bringen, eine Instrumentation Instanz bereitzustellen, ohne einen Agenten anhängen oder vorladen zu müssen?