写在前面
最近我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道的,更让人哭笑不得的是竟然还有人说是2的31次方。那如果真是这样的话,服务器的内存空间还放不下一个字符串呀!作为程序员的我们,可不能闹这种笑话呀。今天,我们就一起来聊聊Java中的String到底占用多大的内存空间!
需要更多Java知识点和面试题的朋友可以点一点下方链接免费领取
链接:1103806531暗号:优快云
Java对象的结构
首先,我们来下Java对象在虚拟机中的结构,这里,以HotSpot虚拟机为例。
从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分:
- Mark Word(标记字段):对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。
- Klass Pointer(Class对象指针):Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class对象(其对应的元数据对象)的内存地址
- 对象实际数据:这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定,比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是4个字节
- 对齐:最后一部分是对齐填充的字节,按8个字节填充。
换种说法就是:
- 对象头(object header):8 个字节(保存对象的 class 信息、ID、在虚拟机中的状态)
- Java 原始类型数据:如 int, float, char 等类型的数据
- 引用(reference):4 个字节
- 填充符(padding)
Java中的String类型
空String占用的空间
这里,我们以Java8为例进行说明。首先,我们来看看String类中的成员变量。
/** The value is used for character storage. */
private final char value[];