写在前面

对于Java中的String类占用多大的内存空间这个问题,是最近面试中问的比较多的一个问题。很多小伙伴的回答的都不是很正确,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道的,更让人哭笑不得的是竟然还有人说是2的31次方。那如果真是这样的话,服务器的内存空间还放不下一个字符串呀!作为程序员的我们,可不能闹这种笑话呀。今天,我们就一起来聊聊Java中的String到底占用多大的内存空间!

Java对象的结构

首先,我们来下Java对象在虚拟机中的结构,这里,以HotSpot虚拟机为例。

293ce1b0a9c93b73f79d2095a563ea76.png

4ee56983db35b3a54054ac2758f85680.png

Java中的String类型

空String占用的空间

这里,我们以Java8为例进行说明。首先,我们来看看String类中的成员变量。

ad24587fe3591bf6a25f70e120371e2f.png

非空String占用的空间

如果String字符串的长度大于0的话,我们也可以得出String占用内存的计算公式,如下所示。

6d3afdb0411a767bbb70dd557a28e582.png

验证结论

5ab877f2a03d4e67f9b2fcb8289c9996.png

2b137b315721851a9cd271b9160f92fa.png

a5fcf196c6e80730a603d53837a7fe25.png

可以看到,使用Jprofiler内存分析工具的结果为:321MB + 96632KB,约等于417MB。之所以使用Jprofiler内存分析工具得出的结果比我们计算的大些,是因为在程序实际运行的过程中,程序内部也会生成一些字符串,这些字符串也会占用内存空间!!

所以,使用Jprofiler内存分析工具得出的结果符合我们的预期。