为什么Java的字符串内存使用率据说很高?

2022-09-04 01:36:53

在这篇博客文章中,据说字符串的最低内存使用量是:

8 * (int) ((((no chars) * 2) + 45) / 8)字节。

因此,对于字符串“Apple Computers”,最小内存使用量为72字节。
即使我有10,000个两倍长度的String对象,内存使用量也会小于2Mb,这根本不多。那么,这是否意味着我低估了企业应用程序中存在的字符串数量,或者这个公式是错误的?

谢谢


答案 1

Java 中的字符串存储取决于字符串的获取方式。后备阵列可以在多个实例之间共享。如果不是这种情况,则通常的对象开销加上一个指针和三个指针的存储,这通常为16字节开销。然后,支持数组需要 2 个字节/,因为 s 是 UTF-16 代码单位。charintcharchar

对于不共享后备阵列的情况,最低成本将是"Apple Computers"

  1. 支持数组,用于 16 个字符 - 32B,在单词边界上很好地对齐。
  2. 指向阵列的指针 - 4 或 8B,具体取决于平台
  3. 三 s 表示偏移量、长度和记忆哈希码 - 12Bint
  4. 2 x 对象开销 - 取决于 VM,但 8B 是一个很好的经验法则。
  5. 一个用于数组长度。int

因此,大约72B,其中实际有效载荷占44.4%。对于较长的字符串,有效负载构成更多。


在Java7中,一些JDK实现取消了支持数组共享,以避免在内存中固定大的[]。这使他们能够消除三个s中的2个。charint

这会将长度为 16 的字符串的计算更改为 64B,其中实际有效负载占 50%。


答案 2

是否可以使用比 Java 字符串更少的内存来保存字符数据?是的。

对于“企业”应用程序(甚至是Android或J2ME应用程序,它们必须在更少的内存上生存)来说,这是否重要?几乎从不。

过早优化是根本...