原文はこちら。
https://blogs.oracle.com/java-platform-group/entry/g1_from_garbage_collector_to
Javaのガベージ・コレクション機能のおかげで、開発者は、不使用のメモリの解放について神経質にならずに、ソフトウェアの作成や手元の作業に集中しやすくなっています。JDK 9では、G1ガベージ・コレクタ(以下、G1GC)がデフォルトのガベージ・コレクタになり、単純にメモリを解放する以上のことが実現できます。単にGCでメモリを解放するだけでなく、G1GCは廃棄物管理コンサルタント(waste management consultant)の役割も担います。つまり、不使用のメモリを解放し、ガベージのトータルの量を削減する方法を特定します。
String deduplicationはJDK8u20で導入され、バックグラウンドタスクとして振る舞います。G1GCがクリーンアップすべきメモリ参照をチェックして、重複するStringを分析し、重複するString間にメモリ節約のためのリンク(memory-saving link)を作成します。他のGCタスクと同様に、開発者はString Deduplicationを機能させるためにコードを変更する必要はありません。CodecentricのFabian Langeが実施した分析によると、「String deduplicationは非同期かつGC中に並行して動作するため、実行時に余計なオーバーヘッドはみられない」とのことです。
下表はJDK 8でString Dedupulicationを有効化するために必要なフラグをまとめたものです。
次の例は、Eclipse MarsとJDK8u72の組合せで実行し、Java Flight Recorderを有効化してGCやオブジェクトの割り当て、全体的なメモリの消費量への影響を確認しようとしています。今回、同じ操作を2回実行していますが、そのうち1回は–XX:+UseStringDeduplicationを付けず、before.jfrという名前を付けて実行して、比較できるようにしています。
以下の行はeclipse.ini内で最後に追加しています。
以下はString Deduplication Statistics(-XX:+PrintStringDeduplicationStatisticsを指定しています)の最終出力です。
https://blogs.oracle.com/java-platform-group/entry/g1_from_garbage_collector_to
Javaのガベージ・コレクション機能のおかげで、開発者は、不使用のメモリの解放について神経質にならずに、ソフトウェアの作成や手元の作業に集中しやすくなっています。JDK 9では、G1ガベージ・コレクタ(以下、G1GC)がデフォルトのガベージ・コレクタになり、単純にメモリを解放する以上のことが実現できます。単にGCでメモリを解放するだけでなく、G1GCは廃棄物管理コンサルタント(waste management consultant)の役割も担います。つまり、不使用のメモリを解放し、ガベージのトータルの量を削減する方法を特定します。
String Deduplication may decrease heap usage by about 10%
Stringオブジェクトはほぼすべてのアプリケーションで使われるオブジェクトですが、アプリケーションは同じStringオブジェクトを様々な理由で1個のクラス、もしくは複数のクラスで複数回格納することがあります。これらのStringオブジェクトを分析することで、JDKはこれらのStringオブジェクトを格納するために必要なトータルのメモリ所要量を削減することができます。String Deduplication(Stringオブジェクトの重複除外)によってヒープの使用量が10%ほど削減できる可能性があります。String deduplicationはJDK8u20で導入され、バックグラウンドタスクとして振る舞います。G1GCがクリーンアップすべきメモリ参照をチェックして、重複するStringを分析し、重複するString間にメモリ節約のためのリンク(memory-saving link)を作成します。他のGCタスクと同様に、開発者はString Deduplicationを機能させるためにコードを変更する必要はありません。CodecentricのFabian Langeが実施した分析によると、「String deduplicationは非同期かつGC中に並行して動作するため、実行時に余計なオーバーヘッドはみられない」とのことです。
下表はJDK 8でString Dedupulicationを有効化するために必要なフラグをまとめたものです。
-XX:+UseG1GC | G1GCを有効にする |
-XX:+UseStringDeduplication | G1GCでString Deduplication機能を有効にする |
-XX:+PrintStringDeduplicationStatistics | 詳細な重複除外統計を出力する(オプションフラグ) |
-XX:StringDeduplicationAgeThreshold=3 | Optional flag to change when Strings become eligible for deduplication.いつStringオブジェクトが重複除外の候補になるかを変更する(オプションフラグ) |
Example: Decreasing memory used by the Eclipse IDE
Eclipseは開発者がソースコードの閲覧、作成を支援する人気のあるIDEです。G1GCは一般的にスループット(例えばサーブレットコンテナ)に焦点を当てた、長期実行中のアプリケーションにとって効果があるとされていますが、クライアントアプリケーションにとっても有用です。次の例は、Eclipse MarsとJDK8u72の組合せで実行し、Java Flight Recorderを有効化してGCやオブジェクトの割り当て、全体的なメモリの消費量への影響を確認しようとしています。今回、同じ操作を2回実行していますが、そのうち1回は–XX:+UseStringDeduplicationを付けず、before.jfrという名前を付けて実行して、比較できるようにしています。
以下の行はeclipse.ini内で最後に追加しています。
バックグラウンドタスクとして、String deduplicationに要した時間は、簡単な使用であればおよそ0.0000908 秒(90.8マイクロ秒)でした。おそらく統計表示により時間がかかっていると思われます。テストしたノートPCは管理された環境ではなく、同じアクションを手作業で実施しましたが、5分間の利用でトータルのヒープ使用量は233MBから213MBへと約9%低下しました。-XX:+UseG1GC
-XX:+UseStringDeduplication
#以下の設定はG1GCのために必ずしも必要ではありませんが、差を評価するために含めています
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:StartFlightRecording=filename=after.jfr,dumponexit=true,maxage=5m,settings=c:/Users/ecostlow /desktop/Everything-Costlow.jfc
-XX:FlightRecorderOptions=dumponexit=true,disk=true,maxage=10m
以下はString Deduplication Statistics(-XX:+PrintStringDeduplicationStatisticsを指定しています)の最終出力です。
[GC concurrent-string-deduplication, 14.5K->6120.0B(8744.0B), avg 38.6%, 0.0000908 secs]
[Last Exec: 0.0000908 secs, Idle: 0.8590383 secs, Blocked: 0/0.0000000 secs]
[Inspected: 142]
[Skipped: 0( 0.0%)]
[Hashed: 89( 62.7%)]
[Known: 21( 14.8%)]
[New: 121( 85.2%) 14.5K]
[Deduplicated: 96( 79.3%) 8744.0B( 58.8%)]
[Young: 0( 0.0%) 0.0B( 0.0%)]
[Old: 96(100.0%) 8744.0B(100.0%)]
[Total Exec: 52/0.1772395 secs, Idle: 52/103.0713572 secs, Blocked: 2/0.1476086 secs]
[Inspected: 322160]
[Skipped: 0( 0.0%)]
[Hashed: 164740( 51.1%)]
[Known: 61960( 19.2%)]
[New: 260200( 80.8%) 20.3M]
[Deduplicated: 144975( 55.7%) 8037.4K( 38.6%)]
[Young: 2( 0.0%) 72.0B( 0.0%)]
[Old: 144973(100.0%) 8037.3K(100.0%)]
[Table]
[Memory Usage: 4213.1K]
[Size: 131072, Min: 1024, Max: 16777216]
[Entries: 132446, Load: 101.0%, Cached: 3622, Added: 170306, Removed: 37860]
[Resize Count: 7, Shrink Threshold: 87381(66.7%), Grow Threshold: 262144(200.0%)]
[Rehash Count: 0, Rehash Threshold: 120, Hash Seed: 0x0]
[Age Threshold: 3]
[Queue]
[Dropped: 0]