最近在看《深入理解Java虚拟机》和《Java并发编程的艺术》这两本书,里面都设计到了计算对象大小的内容,搞了两天终于弄清楚。
首先,参考了这篇文章《一个java对象占多少个字节?》,想彻底理解请先看篇文章,里面的工具已经验证过了,想弄明白最好自己跑一遍加深印象,看看JVM计算的和你计算的是不是一样。
接下来,上干货,各种类型分别占多少个字节(bytes):
计算方式:对象头+实例数据+对齐填充
类型 | 64位(无压缩) | 64位(压缩) |
boolean | 1 | 1 |
byte | 1 | 1 |
short | 2 | 2 |
char | 2 | 2 |
int | 4 | 4 |
float | 4 | 4 |
long | 8 | 8 |
double | 8 | 8 |
普通对象头 | 16 | 12 |
数组对象头 | 24 | 16 |
reference(引用类型) | 8 | 4 |
另:
计算对象本身占用大小和对象总空间占用大小的区别:
1.本身占用大小,对象中除了基本类型之外,其他类型都按照引用来计算,不要计算引用中对象的大小。
2.总空间占用大小,要计算对象中每一个对象的大小,引用中的对象也要计算,再累加获得总空间。
第一行的文章里讲得很清晰了,以上只是总结一下,希望能帮到你。