Java中的String到底占用多大的内存空间?带你一步步验证!

本文探讨了Java中String对象的内存占用,详细分析了空String和非空String的内存消耗,并通过实例验证了计算公式。内容包括Java对象结构、String类型的内存分配以及使用JProfiler进行内存分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

最近我总是问一个问题: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[];
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值