当前位置: 首页 > news >正文

如何获取Java对象的大小

文章目录

      • 1. 使用 `java.lang.instrument.Instrumentation`(精确计算)
      • 2. 使用第三方库(简化实现)
        • 2.1. `jol-core`(Java Object Layout)
        • 2.2. Apache Commons Lang
      • 3. 手动估算(基于JVM规范)
      • 4. 注意事项
      • 5. 工具推荐
      • 总结

1. 使用 java.lang.instrument.Instrumentation(精确计算)

这是最准确的方法,但需要通过Java Agent来实现:

  1. 创建一个Java Agent类
import java.lang.instrument.Instrumentation;public class ObjectSizeAgent {private static volatile Instrumentation globalInstrumentation;public static void premain(String agentArgs, Instrumentation inst) {globalInstrumentation = inst;}public static long getObjectSize(Object obj) {if (globalInstrumentation == null) {throw new IllegalStateException("Instrumentation not initialized");}return globalInstrumentation.getObjectSize(obj);}
}
  1. 配置 MANIFEST.MF

    • MANIFEST.MF 中添加:
      Premain-Class: com.example.ObjectSizeAgent
      
  2. 打包为JAR并运行

    java -javaagent:objectsizeagent.jar YourMainClass
    
  3. 在代码中使用

public class Main {public static void main(String[] args) {MyClass obj = new MyClass();long size = ObjectSizeAgent.getObjectSize(obj);System.out.println("Object size: " + size + " bytes");}
}

2. 使用第三方库(简化实现)

2.1. jol-core(Java Object Layout)

由OpenJDK团队开发,可直接计算对象大小:

import org.openjdk.jol.info.ClassLayout;public class ObjectSizeCalculator {public static void main(String[] args) {MyClass obj = new MyClass();System.out.println(ClassLayout.parseInstance(obj).toPrintable());}
}

依赖(Maven):

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.16</version>
</dependency>
2.2. Apache Commons Lang

SerializationUtils.serialize() 可估算序列化后的大小:

import org.apache.commons.lang3.SerializationUtils;public class ObjectSizeEstimator {public static void main(String[] args) {MyClass obj = new MyClass();byte[] bytes = SerializationUtils.serialize(obj);System.out.println("Serialized size: " + bytes.length + " bytes");}
}

3. 手动估算(基于JVM规范)

对象在内存中的结构通常包括:

  • 对象头(Object Header):
    • Mark Word(通常8字节)
    • 类型指针(4或8字节,取决于是否开启指针压缩)
  • 实例数据(Instance Data):字段的实际值
  • 对齐填充(Padding):按8字节对齐

示例计算

class MyClass {int a;         // 4字节long b;        // 8字节String c;      // 引用类型:4或8字节
}
  • 总大小估算
    • 对象头:12字节(8+4,假设开启指针压缩)
    • 实例数据:4(a) + 8(b) + 4(c) = 16字节
    • 对齐填充:4字节(总大小需为8的倍数)
    • 总计:12 + 16 + 4 = 32字节

4. 注意事项

  • 指针压缩(Compressed OOPs)

    • 64位JVM默认开启,对象引用占4字节(否则占8字节)。
    • 通过 -XX:+UseCompressedOops 控制。
  • 数组和集合

    • 数组对象包含额外的长度字段。
    • 集合类(如 ArrayList)需计算内部数组的大小。
  • 静态字段

    • 静态字段不属于对象实例,不计入对象大小。

5. 工具推荐

  • JProfiler:可视化工具,直接查看对象大小。
  • YourKit:支持内存分析和对象大小统计。
  • Eclipse Memory Analyzer (MAT):分析堆转储文件。

总结

  • 精确计算:使用 Instrumentationjol-core
  • 快速估算:手动计算对象头、字段和对齐填充。
  • 复杂场景:借助专业工具分析堆内存。

一般场景下推荐 方案2

http://www.lqws.cn/news/442999.html

相关文章:

  • MQTT 消息队列传输协议(Message Queuing Telemetry Transport)
  • 【深度学习】生成对抗网络(GANs)深度解析:从理论到实践的革命性生成模型
  • 优化 Python 爬虫性能:异步爬取新浪财经大数据
  • 46道Jenkins高频题整理(附答案背诵版)
  • Jenkins通过Pipeline流水线方式编译Java项目
  • IP 地理库的使用指南:从基础应用到深度实践​
  • Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)
  • IntersectionObserver API应用场景示例代码详解
  • 医疗低功耗智能AI网络搜索优化策略
  • jquery 赋值时不触发change事件解决——仙盟创梦IDE
  • Kafka性能压测报告撰写
  • Outlook邮箱开通发信服务及OAuth2验证开通
  • 靶场(二十五)---小白心得靶场体会---Access
  • 基于Python+PySide6构建的夸克网盘批量工具,支持批量转存与分享
  • 使用NPOI库导出多个Excel并压缩zip包
  • Qt 解析复杂对象构成
  • 基于C#的Baumer相机二次开发教程
  • VACM 详解:SNMPv3 的访问控制核心
  • 基于大模型的急性结石性胆囊炎全流程预测与诊疗方案研究
  • 小白畅通Linux之旅-----Rsync+sersync实现数据实时同步
  • 九九乘法表
  • [Data Pipeline] Kafka消息 | Redis缓存 | Docker部署(Lambda架构)
  • 编辑器及脚本案例
  • 2025-05-05-80x86汇编语言环境配置
  • Java中创建线程的几种方式
  • 软考-软件设计师--校验码
  • 矩阵置零C++
  • jmeter学习
  • ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展
  • HarmonyOS开发利器:ArkTS全解析