如何在Java中获取Instrumentation实例

IAm*_*aja 6 java memory instrumentation

我正在尝试编写一个简单的ObjectUtils类,其中包含所有对象的各种实用程序方法.我想让其中一个调用getObjectSize(Object),在那里传递一个实例化的Object,它在内存中返回Object的大小:

public class ObjectUtils {
    private static volatile Instrumentation instrumentation;

    public static final long getObjectSize(final Object p_oToGauge)
    {
        return instrumentation.getObjectSize(p_oToGauge);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,似乎为了获得一个实现的Instrumentation实例,你需要使用JRE代理和所谓的premain方法做各种奇特的事情.

是否有一种简单的方法可以访问本地JRE的Instrumentation实例?我通过RuntimeAPI 寻找了一些东西但却找不到任何东西.

Evg*_*eev 2

我找到了一个名为InstrumentationFactory.

当有人第一次请求 的实例时Instrumentation,它会创建一个代理 JAR 文件,然后找到自己进程的 PID 并将其附加到该进程内的 JVM...调用它的agentmain(..),为其提供Instrumentation感兴趣的实例。

我不确定这种方法有多可靠。接下来我要尝试的是搜索 OpenJDK 的代码以查看Instrumentation实例的创建位置和方式。也许,在没有安全要求的情况下,有可能(通过反射)让该机制提供实例而Instrumentation无需附加或预加载代理?