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
Generational ZGCのメモリ運用改善 - その物理メモリ使用量、本当に正しい?
Search
Daishi Tabata
June 07, 2025
Technology
1
450
Generational ZGCのメモリ運用改善 - その物理メモリ使用量、本当に正しい?
Daishi Tabata
June 07, 2025
Tweet
Share
More Decks by Daishi Tabata
See All by Daishi Tabata
失敗しないOpenJDKの非互換調査
tabatad
0
1.2k
Other Decks in Technology
See All in Technology
OpenTelemetry の Log を使いこなそう
biwashi
5
1.1k
MCPと認可まわりの話 / mcp_and_authorization
convto
2
290
東京海上日動におけるセキュアな開発プロセスの取り組み
miyabit
0
200
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
2
260
会社もクラウドも違うけど 通じたコスト削減テクニック/Cost optimization strategies effective regardless of company or cloud provider
aeonpeople
2
370
増え続ける脆弱性に立ち向かう: 事前対策と優先度づけによる 持続可能な脆弱性管理 / Confronting the Rise of Vulnerabilities: Sustainable Management Through Proactive Measures and Prioritization
nttcom
1
210
「手を動かした者だけが世界を変える」ソフトウェア開発だけではない開発者人生
onishi
15
7.6k
生成AIによる情報システムへのインパクト
taka_aki
1
200
SAE J1939シミュレーション環境構築
daikiokazaki
1
190
DatabricksのOLTPデータベース『Lakebase』に詳しくなろう!
inoutk
0
160
Railsの限界を超えろ!「家族アルバム みてね」の画像・動画の大規模アップロードを支えるアーキテクチャの変遷
ojima_h
4
520
Expertise as a Service via MCP
yodakeisuke
1
160
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
512
110k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Designing for Performance
lara
610
69k
Making Projects Easy
brettharned
117
6.3k
Become a Pro
speakerdeck
PRO
29
5.4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1k
GraphQLとの向き合い方2022年版
quramy
49
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Transcript
Generational ZGCのメモリ運用改善 - その物理メモリ使用量、 本当に正しい? © 2025 Fujitsu Limited JJUG
CCC 2025 Spring 2025/6/7 田端 大志 @tbtdis
アジェンダ ZGCが抱える問題 ZGCのコア技術から読み解く原因 Generational ZGCでの改善
© 2025 Fujitsu Limited •アプリケーションサーバー製品の開発・保守 •OpenJDK関連のコミュニティ活動 自己紹介 所属:富士通株式会社 OpenJDK JDK
Project Author JCP Executive Committee メンバ 先日JavaOneに参加してきました!
アジェンダ ZGCが抱える問題 ZGCのコア技術から読み解く原因 Generational ZGCでの改善
© 2025 Fujitsu Limited ZGCの特徴 G1GC ZGC チューニング (起動時設定) 必要性が高い
せずとも十分な性能 レイテンシ アプリやチューニング によって変動 1ms以下 スケーラビリティ (ヒープサイズ) ヒープの増大化で レイテンシ鈍化リスク ヒープサイズは レイテンシに無影響 スループット 高い G1GC比 -15%以内
© 2025 Fujitsu Limited ZGCの歩み JDK21 2023/9 JDK23 2024/9 JDK24
2025/3 Generational ZGCリリース Generationalが ZGCのデフォルト化 非Gen ZGCが削除 JDK11 2018/9 実験版リリース (Linuxのみ) JDK14 2020/3 Windows/macOS サポート 正式リリース JDK15 2020/9
© 2025 Fujitsu Limited 非Generational ZGCの問題 アロケーションストール CPUオーバーヘッド メモリ運用 本日の
テーマは こちら
© 2025 Fujitsu Limited 非Generational ZGCの問題(デモ) 使用するJDKのバージョンは21 ZGCのデフォルトは非Generational オブジェクトを作って 定期的に捨てるアプリ
© 2025 Fujitsu Limited 非Generational ZGCの問題(デモ) -8315MB(メモリ使用量) G1GCを使った場合、 メモリ使用量とRSSがおおよそ一致する
© 2025 Fujitsu Limited 非Generational ZGCの問題(デモ) -8434MB(メモリ使用量) 非Generational ZGCを使った場合、 メモリ使用量よりもRSSが多く報告される
※total(マシンの物理メモリ量)より多い
© 2025 Fujitsu Limited 実際のメモリ使用量とRSSの不一致 RSSが実際のメモリ使用量より多く報告される RSSを使った判断・判定ができない 検証マシン 必要なメモリは10GB だから少し余裕を
持ったマシンにしよう Java アプリ RSS:10GB Java アプリ 本番マシン メモリ12GB ⇐ ①過剰報告 ⇐ ②誤判断 ⇐ ③リソースの 無駄遣い
アジェンダ ZGCが抱える問題 ZGCのコア技術から読み解く原因 Generational ZGCでの改善
© 2025 Fujitsu Limited ロードバリア オブジェクトの参照をロードするときにJITコンパイラが処理を追加 String name = person.name;
例 •再配置後のアドレスに書き換える(Remap) •オブジェクトを参照中とマークする(Mark) オブジェクトの状態をみて、 処理 GCによるSTWが激減、1ms以下のレイテンシを実現 ZGC以外 アプリを一時停止してGCスレッドで実行 ZGC アプリの処理の一部として実行
© 2025 Fujitsu Limited ロードバリア オブジェクトの参照をロードするときにJITコンパイラが処理を追加 String name = person.name;
例 •再配置後のアドレスに書き換える(Remap) •オブジェクトを参照中とマークする(Mark) オブジェクトの状態をみて、 処理 GCによるSTWが激減、1ms以下のレイテンシを実現 ZGC以外 アプリを一時停止してGCスレッドで実行 ZGC アプリの処理の一部として実行 オブジェクトの参照のロードは ユーザアプリやAPI内部で頻発するので 無視できないオーバーヘッドとなる オーバーヘッドを軽減する仕組みが必要
© 2025 Fujitsu Limited ZGC以外のオブジェクトの状態取得方法 ヒープ オブジェクト オブジェクト Mark Word
Klass フィールド ・ ・ ・ 状態 状態を取得するには メモリアクセスが必須 状態はヒープ上の オブジェクト内で管理
© 2025 Fujitsu Limited カラーポインタ Unused(16bits) F R M M
オブジェクトアドレス(44bits) オブジェクトポインタ(64 bit) オブジェクトの状態をポインタ内の4bitで表現 メタデータ メモリアクセスを伴わず状態の取得が可能 メモリアクセス分のオーバーヘッドを軽減
© 2025 Fujitsu Limited カラーポインタを使ったアクセス Unused(16bits) F R M M
オブジェクトアドレス(44bits) メタデータ オブジェクトにアクセスするのにメタデータ部分は不要 ⇒ マスク処理でオブジェクトアドレス部分を抽出 この処理も削減できないか?
© 2025 Fujitsu Limited マルチマップメモリ Heap Remapped View Heap Marked1
View Heap Marked0 View ヒープメモリ 仮想アドレス空間 1つの物理メモリを3つのアドレス空間にマップ 各仮想アドレス空間内でオフセットが同じ ポインタは同じ物理メモリのアドレスを指す 例 0x41234 0x21234 0x11234 0x01234 マスク処理を省略 ⇒ オーバーヘッド軽減
© 2025 Fujitsu Limited マルチマップメモリ Heap Remapped View Heap Marked1
View Heap Marked0 View ヒープメモリ 仮想アドレス空間 1つの物理メモリを3つのアドレス空間にマップ 各仮想アドレス空間内でオフセットが同じ ポインタは同じ物理メモリのアドレスを指す 例 0x41234 0x21234 0x11234 0x01234 マスク処理を省略 RSSが実際の物理メモリ 使用量と一致しない原因 ⇒ オーバーヘッド軽減
アジェンダ ZGCが抱える問題 ZGCのコア技術から読み解く原因 Generational ZGCでの改善
© 2025 Fujitsu Limited Generational ZGC Young領域 Old領域 OBJ OBJ
一定期間以上存在した オブジェクトは昇格 JDK21 JDK23 JDK24 正式リリース ZGCのデフォルト化 非Gen ZGCが削除 •使い方(JDK21):-XX:+UseZGC –XX:+ZGenerational 領域ごとのGC戦略 GCパフォーマンスの最適化
© 2025 Fujitsu Limited カラーポインタの拡張 Unused (2bits) R M m
F Object Address(46bits) R R R M m F r r Unused (4bits) メタデータ 世代別のオブジェクトの状態を表現するには より多くのメタデータビットが必要 オブジェクトポインタ(64 bit) Unused (2bits) オブジェクトアドレス (46bits)
© 2025 Fujitsu Limited マルチマップメモリの変更 効果: 効果よりも現実のリスクの方が大きいと判断 オブジェクトアクセス時のマスク処理をなくす ⇒ ロードバリアのオーバーヘッド軽減
•実際の物理メモリ使用量とRSSが一致しなくなる •Generational ZGCのカラーポインタはメタデータが 増えたのでより多くのマルチマップが必要になる 現実: 廃止
© 2025 Fujitsu Limited Generational ZGCの新技術 ストアバリア リメンバーセット SATBマーク ロードバリアのオーバーヘッド軽減目的以外にも様々な改善
Full GC ヒープの高密度化 リロケートの改善
© 2025 Fujitsu Limited Generational ZGC使用時のRSS(デモ) -8486MB(メモリ使用量) Generational ZGCを使った場合、 メモリ使用量よりもRSSが多く報告されない
どちらかというと少し少なく報告されている(セッションで述べていない&未調査)
サマリ 非Generational Generational JDK11~JDK14 △ × JDK15~JDK20 〇 × JDK21~JDK23
〇 ◎ JDK24~ × ◎ ×:未実装 △:実験版 〇:正式版 ZGCはGenerationalの導入で真価を発揮 JDK21以降への移行を検討してみよう ◎:正式版・おすすめ
© 2025 Fujitsu Limited © 2025 Fujitsu Limited Thank you