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]
0 件のコメント:
コメントを投稿