原文地址:查看原文
序言
之前说过在Android中关于enum的使用,对内存的占用比较大,所以就了解了一下内存占用方面,基本上大同小异,下面是我觉得比较全面的描述,重新排版、整理,如果有时间,希望你能好好了解一下。
下面的内容深入分析并验证了不同Java对象占用内存空间大小的情况。对于不同的jvm实现,Java对象占用的内存空间大小可能不尽相同,本文主要分析HotSpot jvm中的情况,实验环境为64位window10系统、JDK1.8,使用JProfiler进行结论验证。
Java对象内存布局
Java对象的内存布局包括
- 对象头(Header)
- 实例数据(Instance Data)
- 补齐填充(Padding)
对象头:
在64位机器上,默认不开启指针压缩(-XX:-UseCompressedOops)的情况下,对象头占用12bytes,开启指针压缩(-XX:+UseCompressedOops)则占用16bytes。
实例数据:
原生类型(primitive type)的内存占用如下:
Primitive Type | Memory Required(bytes) |
---|---|
byte, boolean | 1 byte |
short, char | 2 bytes |
int, float | 4 bytes |
long, double | 8 bytes |
注:对象引用(reference)类型在64位机器上,关闭指针压缩时占用4bytes, 开启时占用8bytes