参考帖子https://bbs.csdn.net/topics/391962675,该贴描述了问题,但没有解决方案,以下是我的解决方式
premain方法调用,但tomcat程序中获取instrumentation是null,原因是premain是系统类加载器加载的,在我们应用程序加载之前就完成了,所以可用系统类加载器获取即能获取到
public class SizeTool { // 注意一定是public修饰 public static Instrumentation instrumentation; public static void premain(String args, Instrumentation inst) { System.out.println(String.format("jvm内存初始化参数: %s,%s", args, inst)); instrumentation = inst; int i = 3; System.out.println("jvm内存初始化:" + instrumentation.getObjectSize(i)); } public static Instrumentation getinst() { try { // 用系统类加载去加载 return (Instrumentation) ClassLoader.getSystemClassLoader() .loadClass(SizeTool.class.getName()) .getDeclaredField("instrumentation") .get(null); } catch(Exception e) { return null; } } public static long sizeOf(Object o) { return getinst().getObjectSize(o); }
}