Pet*_*rey 58 java performance jvm java-7
在此页面甲骨文的Java HotSpot虚拟机的选项,它会列出-XX:+UseCompressedStrings
作为默认选项和.但是在Java 6更新29中,默认情况下它处于关闭状态,并且在Java 7 update 2中它会报告警告
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0
Run Code Online (Sandbox Code Playgroud)
有谁知道删除此选项背后的想法?
有了-mx2g
这个例子,选项打开了4.541秒,在Java 6更新29中关闭了5.206秒.很难看出它会影响性能.
注意:Java 7更新2需要2.0 G,而没有压缩字符串的Java 6更新29需要1.8 GB,压缩字符串只需要1.0 GB.
Nat*_*han 41
最初,添加此选项是为了改善SPECjBB性能.增益是由于处理器和DRAM之间的内存带宽需求减少.在字节[]中加载和存储字节消耗带宽的1/2与char []中的字符相比.
然而,这是有代价的.代码必须确定内部数组是byte []还是char [].这需要CPU时间,如果工作负载不受内存带宽限制,则可能导致性能下降.由于增加的复杂性,还存在代码维护价格.
由于没有足够的类似生产的工作负载显示出显着的收益(除了SPECjBB),该选项已被删除.
还有另一个角度.该选项可减少堆使用量.对于适用的字符串,它会将这些字符串的内存使用量减少1/2.在删除选项时不考虑该角度.对于受内存容量限制的工作负载(即必须以有限的堆空间运行而GC需要花费大量时间),此选项可证明是有用的.
如果可以找到足够的内存容量限制类似生产的工作负载来证明该选项的包含,那么可能会返回该选项.
编辑2013年3月20日:平均服务器堆转储使用字符串的25%空间.大多数字符串都是可压缩的.如果重新引入选项,它可以节省一半的空间(例如~12%)!
编辑3/10/2016:类似于压缩字符串的功能将在JDK 9 JEP 254中重新出现.
npg*_*all 14
只是为了那些感兴趣的人......
所述java.lang.CharSequence中接口(其java.lang.String
实现),允许字符串比UTF-16更紧凑的表示.
其操纵大量字符串的应用程序,可能应该被写入接受CharSequence
,这样,他们将一起工作java.lang.String
,或者更紧凑的表示.
8位(UTF-8),甚至5,6或7位编码,甚至压缩的字符串都可以表示为CharSequence
.
CharSequence
s也可以更有效地操作 - 子序列可以被定义为原始内容上的视图(指针),而不是复制.
例如,在并发树中,莎士比亚戏剧中的十个后缀树需要使用CharSequence
基于节点的2GB RAM,如果使用char []或基于字符串的节点则需要249GB的RAM.
Pet*_*rey 13
由于有投票,我认为我没有遗漏一些明显的东西所以我把它记录为一个错误(至少在文档中的遗漏)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7129417
(应该在几天内可见)
小智 6
Java 9 在我的机器上执行Java中巨大的file.txt的排序行的速度是Java 6的两倍,并且-XX:+CompactStrings
默认情况下也只需要1G的内存.此外,在Java 6中,压缩字符串仅适用于7位ASCII字符,而在Java 9中,它支持Latin1(ISO-8859-1).但是有些操作charAt(idx)
可能稍微慢一点.通过新设计,他们还可以支持其他编码.
我在The Java Specialists's Newsletter上写了一篇关于此的新闻通讯.