String 在 JVM 的存储结构
一般而言,Java 对象在虚拟机的结构如下:
- 对象头(object header):8 个字节
- Java 原始类型数据:如 int, float, char 等类型的数据,各类型数据占内存如 表 1. Java 各数据类型所占内存.
- 引用(reference):4 个字节
- 填充符(padding)
表 1. Java 各数据类型所占内存
数据类型 | 占用内存(字节数) |
---|---|
boolean | 1 |
byte | |
char | 2 |
short | |
int | 4 |
float | |
long | 8 |
double |
然而,一个 Java 对象实际还会占用些额外的空间,如:对象的 class 信息、ID、在虚拟机中的状态。在 Oracle JDK 的 Hotspot 虚拟机中,一个普通的对象需要额外 8 个字节。
如果对于 String(JDK 6)的成员变量声明如下:
1 2 3 4 |
|
那么因该如何计算该 String 所占的空间?
首先计算一个空的 char 数组所占空间,在 Java 里数组也是对象,因而数组也有对象头,故一个数组所占的空间为对象头所占的空间加上数组长度,即 8 + 4 = 12 字节 , 经过填充后为 16 字节。
那么一个空 String 所占空间为:
对象头(8 字节)+ char 数组(16 字节)+ 3 个 int(3 × 4 = 12 字节)+1 个 char 数组的引用 (4 字节 ) = 40 字节。
因此一个实际的 String 所占空间的计算公式如下:
1 |
|
其中,n 为字符串长度。