计算 java对象 内存占用大小

前言

作为小白,关于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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java对象数组占用内存计算方法和Java基本类型数组类似,但需要考虑每个对象占用内存大小Java对象占用内存大小包括对象头部信息和实例数据两部分。Java对象头部信息包括以下三个部分: 1. 标记字:用于标记该对象是否被回收,占用4个字节。 2. 类型指针:指向该对象所属的类,占用4个字节。 3. 实例数据长度:表示该对象实例数据所占用的字节数,占用4个字节。 因此,Java对象头部信息的总大小为12个字节。 Java对象实例数据包括该对象的所有实例变量。实例变量的类型和数量不同,因此每个对象的实例数据大小也不同。 因此,Java对象数组占用内存大小等于数组头部信息的大小加上每个对象实例数据占用大小之和乘以数组长度。 下面以Student对象数组为例,介绍Java对象数组内存大小计算方法: ```java class Student { String name; int age; } Student[] students = new Student[10]; int size = 12 + (ObjectSizeCalculator.getObjectSize(new Student()) * students.length); ``` 上述代码中,`students`是一个长度为10的Student对象数组,`size`即为该数组占用内存大小,其中12为数组头部信息的大小,`ObjectSizeCalculator.getObjectSize(new Student())`为一个Student对象实例占用内存大小,乘以数组长度即为所有Student对象实例占用内存大小之和。 需要注意的是,上述方法只适用于对象没有任何引用类型成员变量的情况。对于对象数组中包含引用类型成员变量的情况,还需要考虑这些成员变量所占用内存大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值