5

如果我用 Java 写这个:

String s = "abc";  

s 是否只占用内存中的 3 个字节?
如果为真,JVM 如何找到 String 对象的结尾?
这会在内存中占用更多字节吗?

4

3 回答 3

7

它需要超过 3 个字节,请继续阅读此页面的完整说明

由于我们将在下面探讨的原因,Java 字符串(在 Hotspot Java 6 VM 中)的最小内存使用量通常如下:

Minimum String memory usage (bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)

或者,换一种说法:

  • 将字符串的字符数乘以 2;
  • 增加38;
  • 如果结果不是 8 的倍数,则向上舍入到下一个 8 的倍数;
  • 结果通常是字符串在堆上占用的最小字节数。

来自同一网站的此页面还详细介绍了使用不同的类来节省内存的方法String

于 2012-09-16T14:48:58.147 回答
2

简短的回答:不,不是很远。众所周知,JVM 字符串非常重。该对象不仅包含指向字符数组的指针,还包含其长度。并且内部存储使用 UTF-16 代码点,所以您的问题可能是“它需要 6 个字节吗?” :-)

对 JVM 的技术参考将为您提供字符串对象的确切大小。您还可以找到一些有趣的博客文章,例如这篇文章和技术文章。

字符串对象的确切大小问题还有很多。我们可以进行对象指针的压缩、字符串实习等。还有一个事实是,由于字符串是不可变的,我们经常共享字符串内存,例如,当您调用时会发生这种情况substring

但是,始终正确的是:它超过 3 个字节。

于 2012-09-16T14:53:25.050 回答
1

最小字符串内存使用量(字节)= 8 * (int) ((((字符数) * 2) + 45) / 8)

于 2012-09-16T14:50:29.957 回答