Java中没有类似C++的sizeof函数,用于返回对象在内存中占用字节数。经查找,在jdk1.5开始,由jdk提供了一个工具包,可以获取对象大小java.lang.instrument.Instrumentation,但是这是一个接口,无法获取其对象,需要在代码启动时加入VM参数 -javaagent参数来指定jar位置才能使用。
现已经写好了代码上传到了GITHub,代码主要做了两件事,一个是代码的简单调用封装,另一个是解决打jar包时给MANIFEST.MF加入Premain-Class属性。
git地址:https://github.com/NickDaDa/java-sizeof
使用方式:
- 把代码克隆下来
- 用maven install 的方式打到本地仓库
- 通过pom.xml引入
- 配置VM Options
- 调用
pom引入:
<dependency>
<groupId>local.util.common</groupId>
<artifactId>InstrumentationAgent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
配置 VM Options:
-javaagent:"D:\.m2_3.6.0\repository\local\util\common\InstrumentationAgent\0.0.1-SNAPSHOT\InstrumentationAgent-0.0.1-SNAPSHOT.jar"
实际项目中配置成Classpath即可。
调用样例:
import java.util.ArrayList;
import java.util.List;
import cn.com.instrument.InstrumentationAgent;
public class InstrumentationExample {
public static void printObjectSize(Object object) {
System.out.println("Object type: " + object.getClass() +
", size: " + InstrumentationAgent.getObjectSize(object) + " bytes");
}
public static void main(String[] arguments) {
String emptyString = "";
String string = "Estimating Object Size Using Instrumentation";
String[] stringArray = { emptyString, string, "com.baeldung" };
String[] anotherStringArray = new String[100];
List<String> stringList = new ArrayList<>();
StringBuilder stringBuilder = new StringBuilder(100);
int maxIntPrimitive = Integer.MAX_VALUE;
int minIntPrimitive = Integer.MIN_VALUE;
Integer maxInteger = Integer.MAX_VALUE;
Integer minInteger = Integer.MIN_VALUE;
long zeroLong = 0L;
double zeroDouble = 0.0;
boolean falseBoolean = false;
Object object = new Object();
class EmptyClass {
}
EmptyClass emptyClass = new EmptyClass();
class StringClass {
public String s;
}
StringClass stringClass = new StringClass();
printObjectSize(emptyString);
printObjectSize(string);
printObjectSize(stringArray);
printObjectSize(anotherStringArray);
printObjectSize(stringList);
printObjectSize(stringBuilder);
printObjectSize(maxIntPrimitive);
printObjectSize(minIntPrimitive);
printObjectSize(maxInteger);
printObjectSize(minInteger);
printObjectSize(zeroLong);
printObjectSize(zeroDouble);
printObjectSize(falseBoolean);
printObjectSize(Day.TUESDAY);
printObjectSize(object);
printObjectSize(emptyClass);
printObjectSize(stringClass);
}
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
}