2012-05-21 33 views
6

我正在嘗試編寫一個簡單的ObjectUtils類,該類包含所有對象的各種實用程序方法。我想對他們有一個叫getObjectSize(Object),你傳遞一個實例化的對象,並在內存中返回對象的大小:如何在Java中獲取Instrumentation的實例

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實例?我通過Runtime API查找了一些東西,但是什麼也找不到。

+2

我_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實例。也許,在沒有安全要求的情況下,有可能(通過反思)讓該機制提供一個實例,而不必附加或預先加載代理?