Java 对象大小的计算

Java对象的大小

如何计算一个对象的大小呢?


正常情况下,对象是分配在堆上。 然而,有些对象并不是分配在堆上。 如small thread-local 对象被分配在栈上或者寄存器中。 还有当前对象的状态也影响对象的大小。比如对象是否占用锁 或者 对象正在垃圾回收中。本章中讨论的是一般意义上的Java对象的大小。

1. 计算对象大小的规则
1.1 在Hotspot中,对象主要包括三部分:

对象头:

基本类型 :

对象引用类型 :占用四个字节

padding : 浪费的空间 便于对象的分配

1.2 基本类型的大小

boolean 1字节
byte 1字节

char 2字节
short 2字节

int 4字节
float 4字节

long 8字节
double 8字节

1.3 对象头的大小
记录一个对象的类 ID 和状态 (比如这个对象是否可达 锁状态) 。在Hopspot中, 正常的对象占头部需要占用8个字节。 数组占用12个字节(四个字节是数组的长度). 其它VM中都有相似的对象的头部。

1.4 对象的大小
Hotspot中,对象的大小必须是8的倍数。这意味着 :

一个空对象占用8个字节
一个仅有一个boolean值的对象 占用16个字节(8 + 1 + 7 )
一个有8个boolean值的对象,也占用16个字节。(no padding)

下一章介绍数组的大小。数组是是一种特殊的对象。在Java中,多维数组是数组的数组。例如二维数组,每一行都是独立的数组对象。

boolean 数组需要每个元素都占用一个字节。尽管每一个字节都存储1Bit。 如果存储大量的位信息,可以使用BitSet。

在C语言中,二位数组是(或者任何多维数组)实际上一维数组。而在Java中,每个多维数组实际上一组内嵌数组。

考虑10*10的整型数组,out Array :12(头部) + 4 * 10 (指向10个一维数组的引用) + 4 (Padding ) = 56 个字节 

10个子数组 占用 (12 + 10 *4 + 4(Padding)) * 10 。 整个二维数组占用11 * 56 = 616个字节。 然而对于100个整型来说 ,只占用 4 * 10 * 10 = 400
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值