【JVM原理探索】Java各种类型对象占用内存情况分析
前言
只有当你到了一定层次,需要了解JVM内部运行机制,或者高并发多线程下,你写的代码对内存有影响,你想做性能优化。当你想深入了解java对象在内存中,如何存储,或者每个对象占用多大空间时。
内存公式
Java对象的内存布局=对象头(Header)+实例数据(Instance Data)+补齐填充(Padding)。
补齐填充
Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数。
Shallow Size
- 对象自身占用的内存大小,不包括它引用的对象。
- 针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
- 针对数组类型的对象,它的大小是数组元素对象的大小总和。
Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。
接下来用JProfiler验证:
- 新建一个空对象,观察空对象内存占用
public class TestObject {
}
复制代码
对象占用内存 16byte,如图:
结论
一般自建空对象占用内存 16Byte,16byte = 12Byte(Header) + 4Byte(Padding)
- 在TestObj中新增一个int属性,观察对象内存占用
public clas