Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JEP 522 Deep Dive - G1 GC同期コスト削減によるスループット向上を徹底検...
Search
Daishi Tabata
May 30, 2026
Technology
950
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JEP 522 Deep Dive - G1 GC同期コスト削減によるスループット向上を徹底検証&解説
Daishi Tabata
May 30, 2026
More Decks by Daishi Tabata
See All by Daishi Tabata
Javaコミュニティの歩き方 ~参加から貢献まで、すべて教えます~
tabatad
0
2.1k
Generational ZGCのメモリ運用改善 - その物理メモリ使用量、本当に正しい?
tabatad
1
820
失敗しないOpenJDKの非互換調査
tabatad
1
2.1k
Other Decks in Technology
See All in Technology
Oracle Cloud Infrastructure IaaS 新機能アップデート 2026/3 - 2026/5
oracle4engineer
PRO
1
220
運用を見据えたAIエージェント設計実践
amacbee
1
3.2k
AI Testing Talks: Challenges of Applying AI in Software Testing: From Hype to Practical Use
exactpro
PRO
1
140
Chart.js が簡単に使えるようになっていたので OGP 画像生成に使った話
kamekyame
0
170
AIを「創る」と「使う」の循環 — HRテックが実践するリアルなAI組織実装
taketo957
0
1.7k
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
3
200
Building applications in the Gemini API family.
line_developers_tw
PRO
0
2.1k
Diagnosing performance problems without the guesswork
elenatanasoiu
0
170
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
440
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.9k
Rancherの紹介&Update情報(RancherJP Online Meetup #09)
yoshiyuki_kono
0
130
いまさら聞けない人のためのAIコーディング入門
devops_vtj
0
130
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
530
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Visualization
eitanlees
152
17k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Unsuck your backbone
ammeep
672
58k
WENDY [Excerpt]
tessaabrams
11
38k
Building Applications with DynamoDB
mza
96
7.1k
Un-Boring Meetings
codingconduct
0
310
Odyssey Design
rkendrick25
PRO
2
690
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
The SEO Collaboration Effect
kristinabergwall1
1
480
Transcript
JEP 522 Deep Dive – G1 GC同期コスト削減による スループット向上を徹底検証&解説 2026/5/30 田端
大志 © 2026 Fujitsu Limited JJUG CCC 2026 Spring @tbtdis
アジェンダ G1 GCのスループット JEP 522のアプローチ解説 デモ&性能評価
3 © 2026 Fujitsu Limited 自己紹介 3 OpenJDK JDK Project
Author JCP Executive Committee メンバー Adoptium WG メンバー 田端 大志 富士通株式会社 ソフトウェアエンジニア
アジェンダ G1 GCのスループット JEP 522のアプローチ解説 デモ&性能評価
5 © 2026 Fujitsu Limited G1 GCってどんなGC? •Java 9以降、ほとんどの環境でデフォルトのGC (参考)Java
27からすべての環境でデフォルトになる予定[JEP 523] •スループットと応答性のバランスを取ることを目指すGC GC種別 スループット 応答性 Parallel GC 高 低 G1 GC 中 中 ZGC 低 高
6 © 2026 Fujitsu Limited G1 GCの応答性 稼働 停止 Parallel
GC 稼働 アプリスレッド GCスレッド アプリスレッド GCスレッド G1 GC 待機 待機 稼働 稼働 停止 稼働 アプリの停止 = Stop The World(STW) 1回のSTWを短くすることで高い応答性を実現 停止 稼働 並行稼働 稼働 並行稼働 稼働 並行稼働
7 © 2026 Fujitsu Limited G1 GCのスループット G1 GC 応答性のための並行稼働の代償
•同時にCPUを使用するためアプリが使えるCPUが減る •オブジェクトの参照更新のたびに同期処理が必要 アプリスレッド GCスレッド アプリケーションのスループットが低下 稼働 停止 稼働 停止 稼働 並行稼働 稼働 並行稼働 稼働 並行稼働 本日の トピック
8 © 2026 Fujitsu Limited GC発生時の参照先更新処理 Javaヒープ a foo x
Foo foo; foo.a = x; 参照 リージョン(領域)
9 © 2026 Fujitsu Limited GC発生時の参照先更新処理 Javaヒープ a foo x
Foo foo; foo.a = x; 参照 GC対象 リージョン
10 © 2026 Fujitsu Limited GC発生時の参照先更新処理 Javaヒープ a foo Foo
foo; foo.a = x; 参照 x x’ GCがオブジェクトを移動 GC対象 リージョン
11 © 2026 Fujitsu Limited GC発生時の参照先更新処理 Javaヒープ a foo Foo
foo; foo.a = x; x x’ 参照 GCがオブジェクトを移動 参照先を更新 xがfoo.aから参照されている情報がないため、 xが移動したことをfoo.aに伝えられない
12 © 2026 Fujitsu Limited Remember Set Javaヒープ a foo
x Foo foo; foo.a = x; 参照 xがfoo.aから参照されている情報を保持 Remember Set(RSet) … … … … … … 0x1234 … …
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 … …
14 © 2026 Fujitsu Limited Remember Setの準備 Javaヒープ a foo
Foo foo; foo.a = x; … … … … … … x x’ 参照 どうやってこの 情報を準備する? 0x1234 … …
15 © 2026 Fujitsu Limited Remember Setの準備方法 •Step 1 •カードテーブルとDCQ(Dirty
Card Queue)を作成 ➢参照の更新が行われたJavaヒープの特定に活用 •Step 2 •カードテーブルとDCQを使ってRemember Setを更新 ➢この処理をRefinementと呼ぶ
16 © 2026 Fujitsu Limited [Step 1] カードテーブル・DCQを作成 a foo
a foo ~ ~ ~ ~ ~ ~ ・・・ 512バイト ~ ~ ~ ~ ~ ~ カードテーブル 1バイト (カード) fooが存在する リージョンを 拡大表示 Javaヒープの512バイトを 1バイトのカードにマッピング = = = = = =
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; 参照
18 © 2026 Fujitsu Limited [Step 2] Refinement •Dirtyカードを処理してRemember Setを更新
•GCがオブジェクトを移動する前に実行される必要あり •GCのSTW中にも行われる ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録 Refinementのプロセス
19 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a
foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 …
20 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a
foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
21 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a
foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
22 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a
foo x 参照 … … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
23 © 2026 Fujitsu Limited [Step 2] Refinementのプロセス Javaヒープ a
foo x 参照 0x1234 … … … … … … … … カードテーブル ・・・ 0x1234 … ①DCQから処理対象のカードを取得 ②カードのマークを外す ③対応するヒープをみて参照先取得 ④参照元に対応するカードのアドレスを 参照先リージョンのRsetに記録
24 © 2026 Fujitsu Limited Remember Setの準備完了 Refinement前 Refinement後 Dirtyカードが処理され、
Remember Setを更新された
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 … …
26 © 2026 Fujitsu Limited 大量のRefinementへの対応 Javaヒープ a foo x
参照 … … … … … … … … … カードテーブル ・・・ アプリケーションによっては大量のカードがDirtyに ⇒ Refinementに時間がかかってSTWが長時間化 Refinementをアプリと並行処理 = Concurrent Refinement
27 © 2026 Fujitsu Limited Concurrent Refinement Javaヒープ a foo
x 参照 … … … … … … … … … カードテーブル ・・・ アプリケーション Refinement GC発生までに一部のDirtyカードを処理 ⇒ STWが短縮
28 © 2026 Fujitsu Limited Concurrent Refinementの同期問題 Javaヒープ a foo
x 参照 … … … … … … … … … カードテーブル ・・・ アプリケーション Refinement 同時に同じカードに処理をしないように 同期を取らなければならない 同期コストによる スループット低下
29 © 2026 Fujitsu Limited ライトバリア(Write Barrier) Foo foo; <pre-write
barrier> foo.a = x; <post-write barrier> 参照更新のたびに追加されるコード post-write barrierの役割 •マークを付ける必要性の有無で フィルタリング •カードのメモリフェンス(同期) •カードにマークを付与 •DCQへの追加 x86-64において、約50命令
30 © 2026 Fujitsu Limited ライトバリアの命令数 GC種別 post-write barrierの 命令数
Parallel GC 7 G1 GC 約50 1回あたりの差は無視できるほど小さい 参照更新が非常に多く行われる場合は性能差につながる
アジェンダ G1 GCのスループット JEP 522のアプローチ解説 デモ&性能評価
32 © 2026 Fujitsu Limited JEP 522 概要 •タイトル G1
GC: Improve Throughput by Reducing Synchronization •サマリ •G1 GC使用時、アプリケーションスレッドとGCスレッド間の 同期処理数を削減し、アプリケーションのスループットを向上する •Goal(達成すること) •G1 GCの同期のオーバーヘッド削減 •G1 GCのライトバリアによって追加されるコード数の削減 •G1 GCのアーキテクチャは維持し、ユーザの操作に影響を与えない
33 © 2026 Fujitsu Limited JEP 522のアプローチ Javaヒープ a foo
x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New
34 © 2026 Fujitsu Limited JEP 522のアプローチ Javaヒープ a foo
x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New 次のGCでSTWの目標時間が満たせないほど Dirtyカードがたまってくると、
35 © 2026 Fujitsu Limited JEP 522のアプローチ Javaヒープ a foo
x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New テーブルをスワップ
36 © 2026 Fujitsu Limited JEP 522によるスループット改善 Javaヒープ a foo
x 参照 カードテーブル ・・・ Refinement テーブル ・・・ New アプリケーション Refinement 同じカードを同時に処理しない →同期が不要に スループット低下の 原因が解消
37 © 2026 Fujitsu Limited ライトバリアの命令数削減 Foo foo; <pre-write barrier>
foo.a = x; <post-write barrier> 参照更新のたびに追加されるコード post-write barrierの役割 •マークを付ける必要性の有無で フィルタリング •カードのメモリフェンス(同期) •カードにマークを付与 •DCQへの追加 同期が不要になった分 処理を削減 x86-64において、約50→12命令
38 © 2026 Fujitsu Limited ライトバリアの命令数削減 GC種別 post-write barrierの 命令数
Parallel GC 7 G1 GC 約50→12 1回あたりの差は無視できるほど小さい 参照更新が非常に多く行われる場合は性能差につながる
アジェンダ G1 GCのスループット JEP 522のアプローチ解説 デモ&性能評価
40 © 2026 Fujitsu Limited デモ(省略)
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%
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% あらゆるアプリケーションで 顕著なスループット向上が 期待できるわけではない
サマリ G1 GCは常に進化を続けている 新しいJavaに移行することで スループット向上が期待できる まずはご自身でお試しで使ってみて JEP 522の効果を評価してみましょう
44 © 2026 Fujitsu Limited © 2026 Fujitsu Limited Thank
you