为什么Java的字符串内存使用量很高?

rth*_*sen 14 java memory string

在这篇博客文章中,据说String的最小内存使用量是:

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

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

谢谢

Mik*_*uel 17

Java中的字符串存储取决于字符串的获取方式.支持char阵列可以在多个实例之间共享.如果不是这种情况,那么你有一个通常的对象开销加上一个指针和三个ints的存储空间通常会产生16个字节的开销.然后,后备阵列需要2个字节,char因为chars是UTF-16代码单元.

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

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

因此,大约72B的实际有效载荷构成44.4%.有效载荷构成更长的字符串.


在Java7中,一些JDK实现正在废除支持阵列共享,以避免char在内存中固定大[] s.这允许他们取消三个中int的两个.

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