空字符串占用空间

对象在内存中的结构主要包含以下几个部分: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[];

/** Cache the hash code for the string */

private int hash; // Default to 0

/** use serialVersionUID from JDK 1.0.2 for interoperability */

private static final long serialVersionUID = -6849794470754667710L;

在 Java 里数组也是对象,因此数组也有对象头。所以,一个数组所占的空间为对象头所占的空间加上数组长度加上数组的引用,即 8 + 4 + 4= 16 字节 。

所以,我们可以得出一个空String对象所占用的内存空间,如下所示。对象头(8 字节)+ 引用 (4 字节 ) + char 数组(16 字节)+ 1个 int(4字节)+ 1个long(8字节)= 40 字节

 

非空String占用的空间

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

其中,n为字符串的长度。

这是因为40是空字符串占用的内存空间,String类实际上是把数据存储到char[]这个成员变量数组中的,而char[]数组中的一个char类型的数据占用2个字节的空间,所以,只是String中的数据就会占用 2 n(n为字符串的长度)个字节的空间,再加上空字符串所占用的40个字节空间,最终得出一个字符串所占用的存储空间为: 40 + 2 * n (n为字符串长度)。

因此在代码中大量使用String对象时,应考虑内存的实际占用情况。

注:40 + 2 * n 这个公式我们可以看成是计算String对象占用多大内存空间的通用公式。

 

可以使用Jprofiler内存分析工具进行分析。使用Jprofiler内存分析工具得出的结果比我们计算的大些,是因为在程序实际运行的过程中,程序内部也会生成一些字符串,这些字符串也会占用内存空间!

 

参考博客:https://blog.csdn.net/bluetjs/article/details/120783781

posted on 2022-08-10 15:06  渐行渐远的那些人  阅读(491)  评论(0编辑  收藏  举报