Java对象内存占用分析

原文地址:查看原文

序言

之前说过在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

| | 总字数统计:93.5k