在阅读了这篇测量几种对象类型的内存消耗的旧文章后,我惊讶地发现String在Java中使用了多少内存:
length: 0, {class java.lang.String} size = 40 bytes
length: 7, {class java.lang.String} size = 56 bytes
Run Code Online (Sandbox Code Playgroud)
虽然文章有一些提示,以尽量减少这种情况,但我发现它们并不完全令人满意.char[]用于存储数据似乎是浪费的.大多数西方语言的明显改进是使用byte[]和编码类似UTF-8,因为你只需要一个字节来存储最频繁的字符,而不是两个字节.
当然可以使用String.getBytes("UTF-8")和new String(bytes, "UTF-8").甚至String实例本身的开销也会消失.但后来有你失去像非常方便的方法equals(),hashCode(),length(),...
Sun有一个专利的byte[]字符串表示,据我可以告诉.
用于在Java编程环境中高效表示字符串对象的框架
......可以实现这些技术,以便在适当时将Java字符串对象创建为单字节字符的数组...
但是我找不到该专利的API.
我为什么在意?
在大多数情况下,我没有.但我使用包含大量字符串的巨大缓存来处理应用程序,这些字符串可以从更有效地使用内存中受益.
有人知道这样的API吗?或者是否有另一种方法可以保持Strings的内存占用空间小,即使以CPU性能或更丑陋的API为代价?
请不要重复上述文章中的建议:
String.intern()(可能与SoftReferences)char[]并利用当前String.subString(.)实现来避免数据复制(讨厌)更新
我从Sun目前的JVM(1.6.0_10)上的文章中运行了代码.它产生了与2002年相同的结果.
我的服务包含大量请求,且HTTP_REFERER值为空。我想正确地解释这一点,并想知道最常见的原因。
我知道 HTTP_REFERER 是一个可选的标头字段,但大多数具有默认设置的浏览器似乎都会发送它们。
到目前为止我发现的常见原因:
缺少什么|无关的|错误?
是否可以在这些项目后面加上百分比?或者也许对列表进行排序并指出比例?
analytics ×1
http ×1
http-referer ×1
java ×1
memory ×1
optimization ×1
performance ×1
referrer ×1
string ×1