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

时间:2012-06-21 03:20:04

标签: java string memory

在这个blog post上,据说字符串的最小内存使用量为:

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

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

由于

3 个答案:

答案 0 :(得分:17)

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

对于不共享支持数组的"Apple Computers",最低成本为

  1. 支持16个字符的数组 - 32B,它在字边界上很好地对齐。
  2. 指向数组的指针 - 4或8B,具体取决于平台
  3. 三个int s用于偏移量,长度和记忆哈希码 - 12B
  4. 2 x对象开销 - 取决于VM,但8B是一个很好的经验法则。
  5. 数组长度为int
  6. 因此大约72B的实际有效载荷构成44.4%。对于更长的字符串,有效负载构成更多。


    在Java7中,一些JDK实现是doing away with backing array sharing,以避免在内存中固定大char []个。这允许他们取消三个int中的两个。

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

答案 1 :(得分:3)

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

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

过早优化是根...

答案 2 :(得分:1)

与您拥有的其他数据类型相比,它肯定很高。其他原语使用32位,64位等

鉴于String是不可变的,每次对它执行任何操作时,最终都会创建一个新的String对象,从而消耗更多的内存。