专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java8中String内存空间占用分析

temp10 2024-11-21 21:22:18 java教程 13 ℃ 0 评论

1.前言

分析之前,简单回顾一下对象的内存分布。

在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三部分:对象头、实例数据和对齐填充。

Java8中String内存空间占用分析

  1. 对象头包含两部分内容:MarkWord和类型指针。
  2. 实例数据是对象真正存储的有效信息,即类型定义的各种类型的字段内容。
  3. 对齐填充不是必须的。HotSpot虚拟机要求对象大小必须是8字节的整数倍,不足8的倍数才需要进行填充。

2.分析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

如上代码,Java8中String类定义了两个成员变量:

  1. char数组类型的value
  2. int类型的hash

因此不难看出String对象所占用内存空间包含3部分:

  1. String对象本身占用空间
  2. char数组对象占用空间
  3. char数组元素占用空间

2.1.String对象本身空间占用分析

  1. 对象头MarkWord占用8个字节。
  2. 对象头类型引用占用4个字节。
  3. char数组引用占用4个字节。
  4. int类型的hash占用4个字节。
String字符串本身占用空间:
24字节 = 字符串头MarkWord(8字节)
      + 字符串头类型引用(4字节)
      + char数组引用(4字节)
      + int类型hash(4字节)

2.2.char数组对应占用空间分析

  1. 对象头MarkWord占用8个字节。
  2. 对象头类型引用占用4个字节。
  3. 数组长度int类型占用4个字节。
char数组占用空间:
16字节 = 字符串头MarkWord(8字节)
      + 字符串头类型引用(4字节)
      + int类型数组长度(4字节)


2.3.char数组元素占用空间分析

每个char元素占用2字节,设数组长度为n,则char数组元素占用空间为2*n。

char数组元素占用空间=2*n

3.结论

忽略对齐填充,定义1个字符串对象,所占内存计算空间计算公式为:

24+16+2n=40+2n

String对象占用空间
=String对象本身占用空间 + char数组对象本身占用空间 + char数组元素占用空间
=24+16+2n=40+2n

以 new String("Hello World")为例:??

"Hello World"的长度为11,则占用空间为: 40B + 2B * 11 = 42B。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表