Java-对象在内存中的占用

本来只想算一下程序占用内存多少,顺便了解了很多东西

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

https://blog.csdn.net/jijianshuai/article/details/79128042

原文地址:https://www.cnblogs.com/lmhyhblog/p/10774024.html