このOracleページ Java HotSpot VMオプション の場合、-XX:+UseCompressedStrings
が使用可能であり、デフォルトでオンになっています。ただし、Java 6 update 29ではデフォルトでオフになっており、Java 7 update 2では警告が報告されます
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0
このオプションを削除する背後にある考え方を誰かが知っていますか?
-mx2g
、この例では、Java 6 update 29)でオプションをオンにして4.541秒、オプションをオフにして5.206秒かかりました。これがパフォーマンスに影響することはわかりません。
注:Java 7 update 2には2.0 Gが必要ですが、Java 6 update 29には圧縮文字列なしで1.8 GB、圧縮文字列ありでは1.0 GBのみ必要です。
当初、このオプションはSPECjBBのパフォーマンスを向上させるために追加されました。これは、プロセッサとDRAM間のメモリ帯域幅要件が緩和されるためです。 byte []にバイトをロードして格納すると、char []のcharに対して帯域幅の半分が消費されます。
ただし、これには代償が伴います。コードは、内部配列がbyte []またはchar []であるかどうかを判別する必要があります。これにはCPU時間を要し、ワークロードがメモリbandwidthで制約されていない場合、パフォーマンスが低下する可能性があります。また、複雑さが増すため、コードのメンテナンス料金がかかります。
(おそらくSPECjBBを除いて)大幅な向上を示す本番のようなワークロードが十分になかったため、オプションは削除されました。
これには別の角度があります。このオプションは、ヒープの使用量を減らします。該当する文字列の場合、それらの文字列のメモリ使用量を1/2に減らします。この角度は、オプションの取り外し時には考慮されていませんでした。メモリ容量が制限されたワークロード(つまり、限られたヒープスペースで実行する必要があり、GCに多くの時間がかかる)の場合、このオプションが役立つことがあります。
オプションが含まれていることを正当化するのに十分なメモリcapacity制約のある本番のようなワークロードが見つかると、可能性がありますオプションは元に戻ります。
編集3/20/2013:平均的なサーバーヒープダンプは、文字列の領域の25%を使用します。ほとんどの文字列は圧縮可能です。このオプションを再度導入すると、このスペースの半分を節約できる可能性があります(例:〜12%)。
Edit 3/10/2016:圧縮文字列と同様の機能がJDK 9で復活しました JEP 254 。
追加するだけで、興味のある人のために...
Java.lang.CharSequence インターフェース(これはJava.lang.String
が実装します)は、UTF-16よりもコンパクトな文字列の表現を可能にします。
多くの文字列を操作するアプリは、Java.lang.String
、、またはよりコンパクトな表現で動作するように、CharSequence
を受け入れるように作成する必要があります。
8ビット(UTF-8)、さらには5、6、または7ビットのエンコードされた文字列、さらには圧縮された文字列はCharSequence
として表すことができます。
CharSequence
sを使用すると、操作がはるかに効率的になります。サブシーケンスは、コピーする代わりに、たとえば、元のコンテンツへのビュー(ポインタ)として定義できます。
たとえば concurrent-trees の場合、シェイクスピアの10プレイのサフィックスツリー、 2GBのRAMが必要CharSequence
ベースのノード、および char []または文字列ベースのノードを使用する場合、249GBのRAM が必要になります。
賛成票があったので、明らかなものを見逃していないと思うので、バグとして記録しました(少なくともドキュメントでは省略しています)。
http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=7129417
(数日後に表示されるはずです)
Java 9は Javaの巨大なfile.txtのソート行 を私のマシンでJava 6の2倍の速度で実行し、1Gのメモリしか必要としないため_-XX:+CompactStrings
_はデフォルトで有効になっています。また、Java 6では、圧縮文字列は7ビットASCII文字に対してのみ機能しましたが、Java 9、Latin1(ISO-8859-1)をサポートします。ただし、charAt(idx)
などの一部の操作は少し遅くなる可能性があります。新しいデザインでは、将来的に他のエンコーディングもサポートする可能性があります。
これについてのニュースレターを The Java Specialists 'Newsletter に書いた。
OpenJDK 7(1.7.0_147-icedtea、Ubuntu 11.10)では、JVMは単に
認識されないVMオプション 'UseCompressedStrings'
いつ Java_OPTS
(またはコマンドライン)には-XX:+UseCompressedStrings
。
オラクルは本当にオプションを削除したようです。