Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JEP 522 Deep Dive - G1 GC同期コスト削減によるスループット向上を徹底検...

JEP 522 Deep Dive - G1 GC同期コスト削減によるスループット向上を徹底検証&解説

Avatar for Daishi Tabata

Daishi Tabata

May 30, 2026

More Decks by Daishi Tabata

Other Decks in Technology

Transcript

  1. 3 © 2026 Fujitsu Limited 自己紹介 3 OpenJDK JDK Project

    Author JCP Executive Committee メンバー Adoptium WG メンバー 田端 大志 富士通株式会社 ソフトウェアエンジニア
  2. 5 © 2026 Fujitsu Limited G1 GCってどんなGC? •Java 9以降、ほとんどの環境でデフォルトのGC (参考)Java

    27からすべての環境でデフォルトになる予定[JEP 523] •スループットと応答性のバランスを取ることを目指すGC GC種別 スループット 応答性 Parallel GC 高 低 G1 GC 中 中 ZGC 低 高
  3. 6 © 2026 Fujitsu Limited G1 GCの応答性 稼働 停止 Parallel

    GC 稼働 アプリスレッド GCスレッド アプリスレッド GCスレッド G1 GC 待機 待機 稼働 稼働 停止 稼働 アプリの停止 = Stop The World(STW) 1回のSTWを短くすることで高い応答性を実現 停止 稼働 並行稼働 稼働 並行稼働 稼働 並行稼働
  4. 7 © 2026 Fujitsu Limited G1 GCのスループット G1 GC 応答性のための並行稼働の代償

    •同時にCPUを使用するためアプリが使えるCPUが減る •オブジェクトの参照更新のたびに同期処理が必要 アプリスレッド GCスレッド アプリケーションのスループットが低下 稼働 停止 稼働 停止 稼働 並行稼働 稼働 並行稼働 稼働 並行稼働 本日の トピック
  5. 10 © 2026 Fujitsu Limited GC発生時の参照先更新処理 Javaヒープ a foo Foo

    foo; foo.a = x; 参照 x x’ GCがオブジェクトを移動 GC対象 リージョン
  6. 11 © 2026 Fujitsu Limited GC発生時の参照先更新処理 Javaヒープ a foo Foo

    foo; foo.a = x; x x’ 参照 GCがオブジェクトを移動 参照先を更新 xがfoo.aから参照されている情報がないため、 xが移動したことをfoo.aに伝えられない
  7. 12 © 2026 Fujitsu Limited Remember Set Javaヒープ a foo

    x Foo foo; foo.a = x; 参照 xがfoo.aから参照されている情報を保持 Remember Set(RSet) … … … … … … 0x1234 … …
  8. 13 © 2026 Fujitsu Limited Remember Setを使った参照先の更新 Javaヒープ a foo

    Foo foo; foo.a = x; … … … … … … x x’ 参照 ①Remember Setを確認 ②xがfoo.aから参照されている情報を取得 ③GCによってxがx’に移動 ④foo.aの参照先をx’に更新 0x1234 … …
  9. 14 © 2026 Fujitsu Limited Remember Setの準備 Javaヒープ a foo

    Foo foo; foo.a = x; … … … … … … x x’ 参照 どうやってこの 情報を準備する? 0x1234 … …
  10. 15 © 2026 Fujitsu Limited Remember Setの準備方法 •Step 1 •カードテーブルとDCQ(Dirty

    Card Queue)を作成 ➢参照の更新が行われたJavaヒープの特定に活用 •Step 2 •カードテーブルとDCQを使ってRemember Setを更新 ➢この処理をRefinementと呼ぶ
  11. 16 © 2026 Fujitsu Limited [Step 1] カードテーブル・DCQを作成 a foo

    a foo ~ ~ ~ ~ ~ ~ ・・・ 512バイト ~ ~ ~ ~ ~ ~ カードテーブル 1バイト (カード) fooが存在する リージョンを 拡大表示 Javaヒープの512バイトを 1バイトのカードにマッピング = = = = = =
  12. 17 © 2026 Fujitsu Limited [Step 1] カードテーブル・DCQを作成 a foo

    a foo ~ ~ ~ ~ ~ ~ ・・・ ~ ~ ~ ~ ~ ~ カードテーブル 参照を更新するときに 対応するカードをマーク(Dirtyにする) 0x1234 … DCQ(Dirty Card Queue) カードをDirtyにしたら カードのアドレス(0x1234)を DCQにエンキュー x = = = = = = Foo foo; foo.a = x; 参照
  13. 18 © 2026 Fujitsu Limited [Step 2] Refinement •Dirtyカードを処理してRemember Setを更新

    •GCがオブジェクトを移動する前に実行される必要あり •GCのSTW中にも行われる ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録 Refinementのプロセス
  14. 19 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a

    foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 …
  15. 20 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a

    foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
  16. 21 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a

    foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
  17. 22 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a

    foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
  18. 23 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a

    foo x 参照 0x1234 … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
  19. 25 © 2026 Fujitsu Limited (再掲)Remember Setを使った参照先の更新 Javaヒープ a foo

    Foo foo; foo.a = x; … … … … … … x x’ 参照 ①Remember Setを確認 ②xがfoo.aから参照されている情報を取得 ③GCによってxがx’に移動 ④foo.aの参照先をx’に更新 0x1234 … …
  20. 26 © 2026 Fujitsu Limited 大量のRefinementへの対応 Javaヒープ a foo x

    参照 … … … … … … … … … カードテーブル ・・・ アプリケーションによっては大量のカードがDirtyに ⇒ Refinementに時間がかかってSTWが長時間化 Refinementをアプリと並行処理 = Concurrent Refinement
  21. 27 © 2026 Fujitsu Limited Concurrent Refinement Javaヒープ a foo

    x 参照 … … … … … … … … … カードテーブル ・・・ アプリケーション Refinement GC発生までに一部のDirtyカードを処理 ⇒ STWが短縮
  22. 28 © 2026 Fujitsu Limited Concurrent Refinementの同期問題 Javaヒープ a foo

    x 参照 … … … … … … … … … カードテーブル ・・・ アプリケーション Refinement 同時に同じカードに処理をしないように 同期を取らなければならない 同期コストによる スループット低下
  23. 29 © 2026 Fujitsu Limited ライトバリア(Write Barrier) Foo foo; <pre-write

    barrier> foo.a = x; <post-write barrier> 参照更新のたびに追加されるコード post-write barrierの役割 •マークを付ける必要性の有無で フィルタリング •カードのメモリフェンス(同期) •カードにマークを付与 •DCQへの追加 x86-64において、約50命令
  24. 30 © 2026 Fujitsu Limited ライトバリアの命令数 GC種別 post-write barrierの 命令数

    Parallel GC 7 G1 GC 約50 1回あたりの差は無視できるほど小さい 参照更新が非常に多く行われる場合は性能差につながる
  25. 32 © 2026 Fujitsu Limited JEP 522 概要 •タイトル G1

    GC: Improve Throughput by Reducing Synchronization •サマリ •G1 GC使用時、アプリケーションスレッドとGCスレッド間の 同期処理数を削減し、アプリケーションのスループットを向上する •Goal(達成すること) •G1 GCの同期のオーバーヘッド削減 •G1 GCのライトバリアによって追加されるコード数の削減 •G1 GCのアーキテクチャは維持し、ユーザの操作に影響を与えない
  26. 33 © 2026 Fujitsu Limited JEP 522のアプローチ Javaヒープ a foo

    x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New
  27. 34 © 2026 Fujitsu Limited JEP 522のアプローチ Javaヒープ a foo

    x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New 次のGCでSTWの目標時間が満たせないほど Dirtyカードがたまってくると、
  28. 35 © 2026 Fujitsu Limited JEP 522のアプローチ Javaヒープ a foo

    x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New テーブルをスワップ
  29. 36 © 2026 Fujitsu Limited JEP 522によるスループット改善 Javaヒープ a foo

    x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New アプリケーション Refinement 同じカードを同時に処理しない →同期が不要に スループット低下の 原因が解消
  30. 37 © 2026 Fujitsu Limited ライトバリアの命令数削減 Foo foo; <pre-write barrier>

    foo.a = x; <post-write barrier> 参照更新のたびに追加されるコード post-write barrierの役割 •マークを付ける必要性の有無で フィルタリング •カードのメモリフェンス(同期) •カードにマークを付与 •DCQへの追加 同期が不要になった分 処理を削減 x86-64において、約50→12命令
  31. 38 © 2026 Fujitsu Limited ライトバリアの命令数削減 GC種別 post-write barrierの 命令数

    Parallel GC 7 G1 GC 約50→12 1回あたりの差は無視できるほど小さい 参照更新が非常に多く行われる場合は性能差につながる
  32. 41 © 2026 Fujitsu Limited Renaissance ベンチマーク 低いほど 高スループット JEP

    522前 JEP 522後 ベンチマーク Renaissance Suite 100.9% 100.1% 100.6% 98.9% 100.6% 101.4% 99.7% 100.4% 100.3% 99.4% 100.8% 100.6% 97.5% 0.0% 20.0% 40.0% 60.0% 80.0% 100.0% 120.0% 100.0% 99.8% 98.7% 101.1% 97.7% 101.8% 97.8% 98.3% 98.9% 103.9% 97.7% 100.4% 0.0% 20.0% 40.0% 60.0% 80.0% 100.0% 120.0%
  33. 42 © 2026 Fujitsu Limited Renaissance ベンチマーク 低いほど 高スループット JEP

    522前 JEP 522後 ベンチマーク Renaissance Suite 100.9% 100.1% 100.6% 98.9% 100.6% 101.4% 99.7% 100.4% 100.3% 99.4% 100.8% 100.6% 97.5% 0.0% 20.0% 40.0% 60.0% 80.0% 100.0% 120.0% 100.0% 99.8% 98.7% 101.1% 97.7% 101.8% 97.8% 98.3% 98.9% 103.9% 97.7% 100.4% 0.0% 20.0% 40.0% 60.0% 80.0% 100.0% 120.0% あらゆるアプリケーションで 顕著なスループット向上が 期待できるわけではない