java如何获取一个对象的大小

Refrence

https://cloud.tencent.com/developer/article/1060294

什么时候需要知道对象的内存大小

在内存足够用的情况下我们是不需要考虑java中一个对象所占内存大小的。但当一个系统的内存有限,或者某块程序代码允许使用的内存大小有限制,又或者设计一个缓存机制,当存储对象内存超过固定值之后写入磁盘做持久化等等,总之我们希望像写C一样,java也能有方法实现获取对象占用内存的大小。

java怎样获取对象所占内存大小

在回答这个问题之前,我们需要先了解java的基础数据类型所占内存大小:

数据类型所占空间(byte)
byte1
short2
int4
long8
float4
double8
char2
boolean1

当然,java作为一种面向对象的语言,更多的情况需要考虑对象的内存布局,java对于对象所占内存大小需要分两种情况考虑:

对象类型内存布局构成
一般非数组对象8个字节对象头(mark) + 4/8字节对象指针 + 数据区 + padding内存对齐(按照8的倍数对齐)
数组对象8个字节对象头(mark) + 4/8字节对象指针 + 4字节数组长度 + 数据区 + padding内存对齐(按照8的倍数对齐)

可以看到数组类型对象和普通对象的区别仅在于4字节数组长度的存储区间。而对象指针究竟是4字节还是8字节要看是否开启指针压缩。Oracle JDK从6 update 23开始在64位系统上会默认开启压缩指针
http://rednaxelafx.iteye.com/blog/1010079。如果要强行关闭指针压缩使用-XX:-UseCompressedOops,强行启用指针压缩使用: -XX:+UseCompressedOops。

接下来我们来举例来看实现java获取对象所占内存大小的方法:

假设我们有一个类的定义如下:

private static class ObjectA {  
	String str;   // 4  
		int i1;       // 4  
		byte b1;      // 1  
		byte b2;      // 1  
		int i2;       // 4   
		ObjectB obj;  //4  
		byte b3;      // 1  
	}
     private static class ObjectB {  
}

如果我们直接按照上面掌握的java对象内存布局进行计算,则有:

Size(ObjectA) = Size(对象头(_mark)) + size(oop指针) + size(数据区)
Size(ObjectA) = 8 + 4 + 4(String) + 4(int) + 1(byte) + 1(byte) + 2(padding) + 4(int) + 4(ObjectB指针) + 1(byte) + 7(padding)
Size(ObjectA) = 40 

我们可以通过两种获取java对象内存占用大小的方式来验证我们的计算是否正确。

具体实现请观看原文:java如何获取一个对象的大小

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值