[Java] G1: from garbage collector to waste management consultant

原文はこちら。
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内で最後に追加しています。
-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に要した時間は、簡単な使用であればおよそ0.0000908 秒(90.8マイクロ秒)でした。おそらく統計表示により時間がかかっていると思われます。テストしたノートPCは管理された環境ではなく、同じアクションを手作業で実施しましたが、5分間の利用でトータルのヒープ使用量は233MBから213MBへと約9%低下しました。
JFR of G1 String Deduplication: before and after
以下は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]

0 件のコメント:

コメントを投稿