在阅读了测量几种对象类型的内存消耗的这篇旧文章之后,我惊讶地看到String在Java中使用了多少内存:
length: 0, {class java.lang.String} size = 40 bytes
length: 7, {class java.lang.String} size = 56 bytes虽然这篇文章有一些技巧来减少这一点,但我并不认为它们完全令人满意。使用char[]存储数据似乎是浪费的。对于大多数西方语言来说,最明显的改进是使用byte[]和像UTF-8这样的编码,因为您只需要一个字节来存储最频繁的字符,而不是两个字节。
当然,我们可以使用String.getBytes("UTF-8")和new String(bytes, "UTF-8")。甚至字符串实例本身的开销也会消失。但是在那里你失去了非常方便的方法,比如equals(),hashCode(),length(),…
据我所知,Sun有一个关于字符串的专利 on byte[]表示。
用于在编程环境中高效表示字符串对象的框架 ..。这些技术可以在适当的时候作为一个字节字符数组来创建Java字符串对象.
但我没能找到那个专利的API。
为什么我在乎?
在大多数情况下,我不这样做,但我处理的应用程序具有巨大的缓存,包含了大量的String,这将从更有效地使用内存中受益。
有人知道这样的API吗?或者,是否有其他方法来保持String的内存占用空间小,即使代价是CPU性能或更丑的API?
请不要重复上述文章中的建议:
String.intern()变体(可能与SoftReferences一起)char[]并利用当前的String.subString(.)实现来避免数据复制(讨厌)更新
我在Sun当前的JVM (1.6.0_10)上运行了本文中的代码。它取得了与2002年相同的结果。
发布于 2008-10-23 19:17:13
出于好奇,节省的几个字节真的值得吗?
通常,出于性能原因,我建议放弃字符串,以支持StringBuffer (记住,字符串是不可变的)。
您真的从字符串引用中耗尽了堆吗?
https://stackoverflow.com/questions/231051
复制相似问题