在这篇博文中,据说 String 的最小内存使用量是:
8 * (int) ((((no chars) * 2) + 45) / 8)
字节。
因此,对于字符串“Apple Computers”,最小内存使用量为 72 字节。
即使我有 10,000 个两倍长度的 String 对象,内存使用量也将小于 2Mb,这根本不算多。那么这是否意味着我低估了企业应用程序中存在的字符串数量,或者那个公式是错误的?
谢谢
Java 中的字符串存储取决于字符串的获取方式。支持char
数组可以在多个实例之间共享。如果不是这种情况,您将拥有通常的对象开销以及一个指针和三个int
s 的存储空间,这通常会产生 16 个字节的开销。然后后备数组每个需要 2 个字节,char
因为char
s 是 UTF-16 代码单元。
对于"Apple Computers"
不共享后备阵列的情况,最小成本将是
int
偏移量、长度和记忆哈希码的三个s - 12Bint
用于数组长度。所以大约 72B,其中实际有效载荷占 44.4%。对于更长的字符串,有效负载构成更多。
在 Java7 中,一些 JDK 实现取消了支持数组共享,以避免将大char
的 [] 固定在内存中。这使他们可以取消三个int
s 中的两个。
这会将长度为 16 的字符串的计算更改为 64B,其中实际有效负载占 50%。
是否可以使用比 Java 字符串更少的内存来保存字符数据?是的。
这对“企业”应用程序(甚至是 Android 或 J2ME 应用程序,它们必须使用更少的内存)有影响吗?几乎从不。
过早的优化是根本...
与您拥有的其他数据类型相比,它肯定很高。其他原语使用 32 位、64 位等。
鉴于它String
是不可变的,每次对它执行任何操作时,最终都会创建一个新String
对象,从而消耗更多内存。