为什么Java的字符串内存使用率据说很高?
在这篇博客文章中,据说字符串的最低内存使用量是:
8 * (int) ((((no chars) * 2) + 45) / 8)
字节。
因此,对于字符串“Apple Computers”,最小内存使用量为72字节。
即使我有10,000个两倍长度的String对象,内存使用量也会小于2Mb,这根本不多。那么,这是否意味着我低估了企业应用程序中存在的字符串数量,或者这个公式是错误的?
谢谢
在这篇博客文章中,据说字符串的最低内存使用量是:
8 * (int) ((((no chars) * 2) + 45) / 8)
字节。
因此,对于字符串“Apple Computers”,最小内存使用量为72字节。
即使我有10,000个两倍长度的String对象,内存使用量也会小于2Mb,这根本不多。那么,这是否意味着我低估了企业应用程序中存在的字符串数量,或者这个公式是错误的?
谢谢
Java 中的字符串存储取决于字符串的获取方式。后备阵列可以在多个实例之间共享。如果不是这种情况,则通常的对象开销加上一个指针和三个指针的存储,这通常为16字节开销。然后,支持数组需要 2 个字节/,因为 s 是 UTF-16 代码单位。char
int
char
char
对于不共享后备阵列的情况,最低成本将是"Apple Computers"
int
int
因此,大约72B,其中实际有效载荷占44.4%。对于较长的字符串,有效负载构成更多。
在Java7中,一些JDK实现取消了支持数组共享,以避免在内存中固定大的[]。这使他们能够消除三个s中的2个。char
int
这会将长度为 16 的字符串的计算更改为 64B,其中实际有效负载占 50%。
是否可以使用比 Java 字符串更少的内存来保存字符数据?是的。
对于“企业”应用程序(甚至是Android或J2ME应用程序,它们必须在更少的内存上生存)来说,这是否重要?几乎从不。
过早优化是根本...