前言
因为String 并不是我们熟知的基本数据类型(int、double、char…),所以在Java中都会用对象来存储,那么String类型占用的内存到底有多少呢,本文将深度探索,并且附有测试代码!
Java的对象
首先了解一下Java的对象结构(在HotSpot虚拟机中)
- markword:占4个字节,主要包括hashCode信息,锁对象信息以及GC年龄信息等。
- class pointer :占4个字节,指向class对象文件
- length:占4个字节,如果这是数组对象,在对象头中还会包括数组长度,
- instance data:包括了对象里面的所有成员变量,所以这个大小由各个成员变量的大小决定。(byte和boolean是1字节,char和short是2字节,int和float是4字节,double和long是8字节)reference的4字节 是都要算上的,因为那些具体的成员变量都要通过引用指过去
Java的String类型
这里看一下Java13 中String类的相关成员变量
@Stable
private final byte[] value;
/** Cache the hash code for the string */
private int hash; // Default to 0
/**
* Cache if the hash has been calculated as actually being zero, enabling
* us to avoid recalculating this.
*/
private boolean hashIsZero; // Default to false;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final lo