前言
本文中的储存分析以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字节。
作者:神圣大黄瓜
DOUBLE
int
大学
class
char
教程