You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java Instrumentation getObjectSize时遇NPE问题求助

问题排查与解决方法

可能的原因及对应解决方案

1. Premain方法实现存在疏漏

检查你的ObjectSizeFetcher类的premain方法,必须确保静态instrumentation变量被正确赋值,且方法签名完全符合规范,不能因未捕获异常导致初始化中断。

正确的premain实现示例:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static volatile Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        // 直接赋值静态变量,无需多余的非空判断
        instrumentation = inst;
        System.out.println("Premain执行完成,instrumentation已初始化");
    }

    public static long getObjectSize(Object obj) {
        if (instrumentation == null) {
            throw new IllegalStateException("Instrumentation未完成初始化");
        }
        return instrumentation.getObjectSize(obj);
    }
}

注意:

  • 用volatile修饰静态变量,避免多线程下的可见性问题
  • 必须保留premain方法的两个参数,即使args未使用

2. Javaagent参数配置错误

检查MAVEN_OPTS中agent的路径是否正确,必须指向包含premain-class配置的jar包,路径含空格时需加引号包裹。

验证命令:

echo $MAVEN_OPTS

输出应包含正确的agent路径,例如:

-javaagent:"/Users/xxx/.m2/repository/com/xxx/object-size-fetcher/1.0/object-size-fetcher-1.0.jar"

3. JDK9+模块化限制

JDK20属于模块化系统,若项目存在module-info.java,必须显式声明依赖java.instrument模块:

module your.module.name {
    requires java.instrument;
    // 若需外部模块调用ObjectSizeFetcher,需添加导出声明
    exports com.your.package to other.module.name;
}

4. 类加载器隔离问题

若ObjectSizeFetcher被多个类加载器加载,会导致每个加载器持有独立的静态instrumentation变量,而调用getObjectSize的类所在加载器对应的变量未初始化。

解决方法:

  • 检查maven依赖,避免重复引入agent jar包
  • 确保agent类由系统类加载器加载(premain方法的类默认由系统类加载器处理)

5. Premain未被实际执行

即使你看到“初始化成功”的提示,也可能是自定义日志,实际premain未被JVM调用。可在premain方法中添加日志确认执行情况,若未输出日志,需:

  • 检查pom.xml中Premain-Class的配置是否为完整包名+类名
  • 解压agent jar,查看META-INF/MANIFEST.MF是否包含Premain-Class属性,示例:
    Premain-Class: com.your.package.ObjectSizeFetcher
    

验证步骤

  1. 检查agent jar的MANIFEST.MF,确认Premain-Class配置正确
  2. 执行maven命令前,输出MAVEN_OPTS确认agent参数无误
  3. 运行程序时查看premain的日志输出,确认instrumentation被赋值
  4. 调用getObjectSize前,可打印ObjectSizeFetcher.instrumentation的值(包内可见时)

内容的提问来源于stack exchange,提问作者morpheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:55:24