计算 java对象 内存占用大小

这篇博客探讨了Java对象的内存结构,包括对象头、实例数据和对齐填充,并提供了计算Java对象大小的公式。博主介绍了在不同操作系统下对象头的组成部分,以及如何利用sun.misc.unsafe、ObjectSizeCalculator和RamUsageEstimator等工具来估算对象内存占用。
摘要由CSDN通过智能技术生成

前言

作为小白,关于Java对象的大小还停留在 8种基本类型和其包装类占用几个字节的
阶段。最近,突然发现Java对象的内存大小似乎不这么简单,就想暂且写点东西,记录一下新知识。

Java对象内存结构

总体上,提到java对象内存大小,主要分为 数组类型和非数组类型 两大类来探究。
就如同下图一样,所有的java对象一般包括 对象头(Header),实例数据(Instance data),对齐填充(padding)三部分,其中padding根据需要而存在。
在这里插入图片描述
不同的操作系统,其对象头的各部分大小如下:
32位操作系统

区域 大小(B)
klass 4
mark 4
数组长度 4

64位操作系统(指针无压缩)

区域 大小(B)
klass 8
mark 8
数组长度 4

64位操作系统(指针有压缩)

区域 大小(B)
klass 4
mark 8
数组长度 4

Java对象大小的计算公式

根据上一小节,我们可知:
Java对象大小=对象头(klass+mark+ 数组长度)+实例数据+对齐填充区

再结合一个原则,即对象属性按照 “long/double(8B) –> int/float(4B) –> short/char(2B) –> byte/boolean(1B) –> reference” 排序,我们可得出万能公式
Java对象大小=klass+mark+array_length+实例数据(字段排序且加补齐填充)

64位操作系统实例:

public class UserVo {
   
    private String name;//4
    private int id;//4
    private double money;//8
    private byte health;//1
    private boolean isGirl;//1
    private short age;//2
}
@Test
public void testaa() {
   
    UserVo userVo = new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值