本来只想算一下程序占用内存多少,顺便了解了很多东西
Java对象的内存布局包括:对象头(Header),实例数据 (Instance Data)和补齐填充(Padding)
对象头
包含:Mark Word(哈希值,GC分代年龄,锁的级别等),Class Metadata Address(存储对象是哪个实例的地址),ArrayList(只有数组对象才会有此数据,存储数组的长度)
32位系统(64位系统✖️2即可)
对象头占用:32+32=64bit。64bit/8=8byte
数组对象头占用:32+32+32=96bit。96bit/8=12byte
(细节可以查看https://www.cnblogs.com/noncontradiction/p/10773352.html)
实例数据
实例数据就是实例变量,分为:基本类型和引用类型
引用类型(reference)在32位机器上是4bytes,64位机器上是8bytes(开启指针压缩以后占用4字节)
补齐填充
对象在堆中分配的存储单位是8byte。如果不够8的倍数,则对齐填充够8的倍数个字节
参考资料
里面还计算了很多数据类型的内存占用大小https://blog.csdn.net/codershamo/article/details/52605113