使用JavaAgent打印Object的大小

 

  • 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的原因是内存对齐。 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半路出家的码农小王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值