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)的成员变量声明如下:
private final char value[];
private final int offset;
private final int count;
private int hash;
那么应该如何计算该 String 所占的空间?
首先计算一个空的 char 数组所占空间,在 Java 里数组也是对象,因而数组也有对象头,故一个数组所占的空间为对象头所占的空间加上数组长度,即 8 + 4 = 12 字节 , 经过填充后为 16 字节。
那么一个空 String 所占空间为:
对象头(8 字节)+ char 数组(16 字节)+ 3 个 int(3 × 4 = 12 字节)+1 个 char 数组的引用 (4 字节 ) = 40 字节。
因此一个实际的 String 所占空间的计算公式如下:
8*( ( 8+2*n+4+12)+7 ) / 8 = 8*(int) ( ( ( (n) *2 )+43) /8 )
其中,n 为字符串长度。
本文深入探讨了Java String对象在Java虚拟机(JVM)中的存储结构,包括对象头、引用和填充符等部分。通过具体实例展示了如何计算一个实际String对象所占用的空间,并详细说明了数组、基本数据类型以及引用在内存分配中的作用。

被折叠的 条评论
为什么被折叠?



