前言
本文中的储存分析以64位机器上的java为标准,其他主流语言也基本相通。
在分析储存空间大小前我们需要掌握基本知识:
- bit:位,是表示信息的最小单位,取值为0或1
- byte:字节,一个byte等于8个bit
- 64位机器:在计算机架构中,64位整数、内存地址或其他数据单元,是指它们最高达到64位(8字节)宽
基本类型
类型 | 占用字节 |
---|---|
boolean | 1 |
byte | 1 |
char | 2 |
int | 4 |
float | 4 |
long | 8 |
数组类型 | 占用字节 |
---|---|
char[] | 2N+24 |
int[] | 4N+24 |
double[] | 8N+24 |
类(class)的内存占用分析
- 对象头Object overhead:占用16个字节
- 引用Reference :占用8个字节
- 填充部分Padding :每个类的其他组成部分要占用8个字节
Padding可能不太好理解,我们以下面这个Date类为例进行分析讲解:
我们看到对象头占用了16个字节,day、month、year各自占用了4个字节,但是问题来了,我只能8个字节8个字节的占用,day和month可以正好占用8个字节,year就需要和padding填充块共同占用8个字节。因此,总的空间占用位32个字节。
我们再来看看第二个例子:
对于一个String类,需要有一个char类型的数组储存值,占用2N+24个字节(参照上面的数组占用)
同时因为引用到了数组,需要加上8字节的空间。
offset、count、hash三个int类型的参数再加上为了凑到8字节的整数倍而加上的4字节的padding填充部分,一共16字节
因此总共的空间占用位2N+64字节。