是否有 java.lang.String 的内存高效替代品?在JVM的一点点帮助下...目的证明手段的合理性让它变得重要!
在阅读了这篇测量几种对象类型的内存消耗的旧文章后,我惊讶地发现Java中使用了多少内存:String
length: 0, {class java.lang.String} size = 40 bytes
length: 7, {class java.lang.String} size = 56 bytes
虽然本文有一些技巧可以最大限度地减少这种情况,但我发现它们并不完全令人满意。用于存储数据似乎是浪费的。对于大多数西方语言来说,明显的改进是使用和像UTF-8这样的编码,因为你只需要一个字节来存储最常见的字符,而不是两个字节。char[]
byte[]
当然,可以使用 和 。甚至 String 实例本身的开销也会消失。但是在那里你失去了非常方便的方法,如,,,...String.getBytes("UTF-8")
new String(bytes, "UTF-8")
equals()
hashCode()
length()
据我所知,Sun拥有Strings表示的专利。byte[]
在Java编程环境中有效表示字符串对象的框架...
这些技术可以实现,以便在适当的时候将Java字符串对象创建为单字节字符数组...
但我未能找到该专利的API。
我为什么在乎?
在大多数情况下,我没有。但是我处理的应用程序具有巨大的缓存,包含大量字符串,这将受益于更有效地使用内存。
有人知道这样的API吗?或者有没有另一种方法可以保持字符串的内存占用量较小,即使以牺牲CPU性能或更丑陋的API为代价?
请不要重复上述文章中的建议:
- 自己的变体(可能带有
String.intern()
SoftReferences
) - 存储单个并利用当前实现以避免数据复制(讨厌)
char[]
String.subString(.)
更新
我在 Sun 当前的 JVM (1.6.0_10) 上运行了文章中的代码。它产生了与2002年相同的结果。