java 获取对象的字节数

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

使用方式:

  1. 把代码克隆下来
  2. 用maven install 的方式打到本地仓库
  3. 通过pom.xml引入
  4. 配置VM Options
  5. 调用

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
    }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值