6

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

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实例?我通过RuntimeAPI 寻找了一些东西,但什么也没找到。

4

1 回答 1

2

我找到了一个名为InstrumentationFactory.

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

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

于 2016-08-28T09:16:13.923 回答