小编the*_*man的帖子

是否有一个内存有效的java.lang.String替换?

在阅读了这篇测量几种对象类型的内存消耗的旧文章后,我惊讶地发现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年相同的结果.

java memory string optimization performance

36
推荐指数
6
解决办法
2万
查看次数

无推荐人请求的最常见原因是什么?

我的服务包含大量请求,且HTTP_REFERER值为空。我想正确地解释这一点,并想知道最常见的原因。

我知道 HTTP_REFERER 是一个可选的标头字段,但大多数具有默认设置的浏览器似乎都会发送它们。

到目前为止我发现的常见原因:

  • 代理
  • 机器人
  • JavaScript 链接(全部?此浏览器相关吗?)
  • 来自书签或作为浏览器启动页的请求
  • 用户手动输入 URL
  • 闪存链接
  • 来自不同应用程序(例如电子邮件客户端)的链接
  • 浏览器设置或隐私浏览器插件
  • 一些个人防火墙会过滤引荐来源网址
  • 如果通过半官方刷新 http 标头进行重定向,大多数浏览器不会发送引荐来源网址
  • 像这样的推荐人伪造者

缺少什么|无关的|错误?

是否可以在这些项目后面加上百分比?或者也许对列表进行排序并指出比例?

http-referer analytics http referrer

5
推荐指数
1
解决办法
4806
查看次数