$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Generational ZGCのメモリ運用改善 - その物理メモリ使用量、本当に正しい?
Search
Daishi Tabata
June 07, 2025
Technology
1
610
Generational ZGCのメモリ運用改善 - その物理メモリ使用量、本当に正しい?
Daishi Tabata
June 07, 2025
Tweet
Share
More Decks by Daishi Tabata
See All by Daishi Tabata
Javaコミュニティの歩き方 ~参加から貢献まで、すべて教えます~
tabatad
0
1.2k
失敗しないOpenJDKの非互換調査
tabatad
0
1.7k
Other Decks in Technology
See All in Technology
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.3k
AIにおける自由の追求
shujisado
3
470
Ryzen NPUにおけるAI Engineプログラミング
anjn
0
230
Design System Documentation Tooling 2025
takanorip
1
930
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
380
MCP・A2A概要 〜Google Cloudで構築するなら〜
shukob
0
160
.NET 10 のパフォーマンス改善
nenonaninu
2
4.8k
AI/MLのマルチテナント基盤を支えるコンテナ技術
pfn
PRO
5
750
小さな判断で育つ、大きな意思決定力 / 20251204 Takahiro Kinjo
shift_evolve
PRO
1
340
Security Diaries of an Open Source IAM
ahus1
0
120
AI時代におけるアジャイル開発について
polyscape_inc
0
110
ブロックテーマとこれからの WordPress サイト制作 / Toyama WordPress Meetup Vol.81
torounit
0
340
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
4 Signs Your Business is Dying
shpigford
186
22k
KATA
mclloyd
PRO
32
15k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
120
20k
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.3k
Building an army of robots
kneath
306
46k
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