- 1.新建maven工程ObjectSize,项目结构如下
2.创建文件ObjectSizeAgent
package com.xw.objectsize;
import java.lang.instrument.Instrumentation;
public class ObjectSizeAgent {
private static Instrumentation inst;
public static void premain(String agentArgs, Instrumentation _inst) {
inst = _inst;
}
public static long sizeOf(Object o) {
return inst.getObjectSize(o);
}
}
3. mvn install 打成jar包并上传到本地仓库
4.使用WinRAR打开ObjectSize-1.0.jar,修改META-INF/MANIFEST.MF并保存(我用其他压缩软件试了,会破坏压缩结构,WinRAR没有这问题)
Manifest-Version: 1.0
Created-By: xw.com
Premain-Class: com.xw.objectsize.ObjectSizeAgent
注意:Premain-Class这行必须是新的一行(回车 + 换行),可以在项目的src目录下创建MANIFEST.MF,确认idea不能有任何错误提示 (这步的目的是保证MANIFEST.MF没有改错),修改后
5.在需要的项目中添加依赖
<dependency>
<groupId>com.xw</groupId>
<artifactId>ObjectSize</artifactId>
<version>1.0</version>
</dependency>
6.运行时需要该Agent Jar的类,加入参数:
-javaagent:D:\repository\com\xw\ObjectSize\1.0\ObjectSize-1.0.jar
7. 使用该类
public class SizeOfAnObject {
public static void main(String[] args) {
System.out.println(ObjectSizeAgent.sizeOf(new Object()));
System.out.println(ObjectSizeAgent.sizeOf(new int[] {}));
System.out.println(ObjectSizeAgent.sizeOf(new P()));
}
//一个Object占多少个字节
// -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
// Oops = ordinary object pointers
private static class P {
//8 _markword
//4 _class pointer
int id; //4
String name; //4
byte b1; //1
short s2; //2
Object o; //4
byte b3; //1
}
}
8.运行结果
注:P对象打印出来32的原因是内存对齐。