Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Javaプロファイラの信頼性とバイアスへの付き合い方
Search
Kenji Kazumura
June 16, 2024
Programming
1.1k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Javaプロファイラの信頼性とバイアスへの付き合い方
JJUG CCC 2024 Spring
Kenji Kazumura
June 16, 2024
More Decks by Kenji Kazumura
See All by Kenji Kazumura
TornadoVMが切り拓くJavaの新領域
kazumura
1
210
Production-Ready Agentic AI Building Enterprise-Grade Java Systems with Jakarta EE and MicroProfile
kazumura
0
64
LangChain4jとは一味違うLangChain4j-CDI
kazumura
2
790
FFMとJVMの実装から学ぶJavaのインテグリティ
kazumura
0
460
Cloud Native Sandboxing with seccomp and AppArmor
kazumura
0
71
JakartaOne Japan 2025
kazumura
2
310
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
490
Troubleshooting Cloud-Native Java Applications in Container Environments While Maintaining Security
kazumura
0
110
コンテナ環境でのJavaトラブルシューティング
kazumura
14
4.4k
Other Decks in Programming
See All in Programming
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
180
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
150
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.6k
sbt 2.0: takeoff
eed3si9n
0
140
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
330
contenteditable と日本語入力に向き合う
colorful12
0
190
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
Are APIs Still Relevant in the AI Era?
soyuka
0
460
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
190
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
480
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
WENDY [Excerpt]
tessaabrams
14
40k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
Build your cross-platform service in a week with App Engine
jlugia
234
19k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Unsuck your backbone
ammeep
672
58k
Transcript
© 2024 Fujitsu Limited 2024/06/16 数村憲治 Javaプロファイラの 信頼性とバイアスへの 付き合い方 JJUG
CCC Spring 2024 @kkzr
プロファイラの概要とバイアス バイアスの仕組み プロファイラの実態 バイアスへの対処 アジェンダ
3 © 2024 Fujitsu Limited © 2024 Fujitsu Limited 自己紹介
Jakarta EE 仕様策定委員 MicroProfile ステコミ委員 JCP Executive Committee メンバー Eclipse Foundation ボードディレクター EclipseCon、 JakartaOne、JJUGなどで登壇 3
プロファイラの概要とバイアス バイアスの仕組み プロファイラの実態 バイアスへの対処 アジェンダ
5 プロファイラ分類 © 2024 Fujitsu Limited 正確にトレースできるが重い。 gprof、BCIなど。 あまり使われていない? 確率的。
プロファイラ インストゥルメント (instrumentation) サンプリング 本日の テーマは こちら
6 サンプリング成立条件 © 2024 Fujitsu Limited 十分なサンプリング数 計測時間を長くするか、サンプリング間隔を短くする オーバーヘッド・副作用が少ない JIT(インライン等)に影響
確率的なサンプリング分布
7 プロファイラとバイアス © 2024 Fujitsu Limited ほぼすべてのプロファイラにはバイアスがある ランニングスレッド4つだけサンプリングする Javaメソッドだけサンプリングする 10ミリ秒ごとにサンプリングする
・・・ 例
8 プロファイラの正しさ © 2024 Fujitsu Limited 「正しさ」の定義は難しい コスト分布が分からないのでプロファイラを使う 正しいコスト分布が分かっているなら、 プロファイラを使う必要はない
どちらが「正しい」かは重要ではない プロファイラX 80% 20% メソッドA メソッドB プロファイラY 70% 30% メソッドA メソッドB
9 アクション可能なプロファイラ © 2024 Fujitsu Limited プロファイラの結果からアクション可能か、が大事 アクション可能な例 プロファイラX 80%
20% メソッドA メソッドB プロファイラY 70% 30% メソッドA メソッドB 「メソッドAをチューニング」というアクション設定が可能
10 アクション不可能な例 © 2024 Fujitsu Limited プロファイラX 80% 20% メソッドA
メソッドB プロファイラY 70% 30% メソッドA メソッドB どちらかが間違っているか、どちらも間違っているか 主な理由は、バイアスと副作用 なので、プロファイラのバイアスを知っておくのが大切
プロファイラの概要とバイアス バイアスの仕組み プロファイラの実態 バイアスへの対処 アジェンダ
12 確率的でないサンプリング分布例 © 2024 Fujitsu Limited 10ミリ秒ごとのサンプリング 時間 スレッド1 コンテキストスイッチ
キャッシュミスが多い 10ms セーフポイントバイアス スレッドダンプ CPU スレッド2 スレッド3 スレッド1 10ms 10ms
13 セーフポイント © 2024 Fujitsu Limited スレッドの状態が、安全・安定している場所 安全な例 危険な例 スタック
メモリ Javaヒープ CPU レジスタ スタック メモリ スレッド スレッド オブジェクト オブジェクト 0x20000 0x30000 R4 R1 R3 R2 CPU レジスタ R4 R1 R3 R2
14 セーフポイント仕組み © 2024 Fujitsu Limited スレッドを制御する信号機みたいなもの ~通常時~ 信号は青 アプリケーションは走り続ける
15 セーフポイント仕組み © 2024 Fujitsu Limited スレッドを制御する信号機みたいなもの ~セーフポイント開始時~ JVMが信号を赤にする アプリケーションは信号に到達したら止まる
Java VM
16 セーフポイント仕組み © 2024 Fujitsu Limited スレッドを制御する信号機みたいなもの ~セーフポイント時~ 信号は赤 アプリケーションは最寄りの信号で止まっている
Java VM
17 セーフポイント仕組み © 2024 Fujitsu Limited スレッドを制御する信号機みたいなもの ~セーフポイント終了時~ JVMが信号を青にする アプリケーションは走りだす
Java VM
18 test命令によるセーフポイント実装 © 2024 Fujitsu Limited mov 0x458(%r15),%r11 test %eax,(%r11)
%r15 スレッド ポインタ 0x458 bad page Java VMが goodpage または badpageを設定 アクセス可能ページ アクセス不可ページ メモリ シグナルハンドラ経由で セーフポイント good page スレッド オブジェクト(C++) 単なるメモリアクセス
19 セーフポイント設置場所 © 2024 Fujitsu Limited セーフポイント カウントありループ for (int
i = 0 ; i < m ; ++i) { ・・・ } while (flag == true) { ・・・ } カウントなしループ セーフポイントは 設定されない カウントなしループ メソッド終了 JNI呼出し終了
20 セーフポイント設置場所 © 2024 Fujitsu Limited -XX:-UseCountedLoopSafepoints で制御可能 最近のJVMではカウントありでも なしでも、セーフポイントが設置
カウントなしループ メソッド終了 JNI呼出し終了 カウントありループ for (int i = 0 ; i < m ; ++i) { ・・・ } セーフポイントは 設定されないる
プロファイラの概要とバイアス バイアスの仕組み プロファイラの実態 バイアスへの対処 アジェンダ
22 プロファイラの実行ステップ © 2024 Fujitsu Limited ハイブリッドプロファイラ サンプリング (PC採取) スタックトレース
(FP walk) スタックトレース採取 (Javaスレッドダンプ) シンボルと照合し表示 一般的プロファイラ サンプリング (PC採取) スタックトレース (FP walk) シンボルと照合し 表示 Javaプロファイラ スタックトレース採取 (Javaスレッドダンプ) 表示
23 JavaスレッドダンプAPI © 2024 Fujitsu Limited Java API JVMTI API
Thread.getAllStackTraces() Thread.getStackTrace() GetStackTrace() GetAllStackTraces() https://docs.oracle.com/javase/jp/21/docs/specs/jvmti.html#stack https://docs.oracle.com/javase/jp/21/docs/api/java.base/java/lang/Thread.html#getStackTrace() https://docs.oracle.com/javase/jp/21/docs/api/java.base/java/lang/Thread.html#getAllStackTraces() いずれもsafepointで実施
24 AsyncGetCallTrace © 2024 Fujitsu Limited https://bugs.openjdk.org/browse/JDK-8178287 void AsyncGetCallTrace (ASGCT_CallTrace
*trace, jint depth, void* ucontext) hotspot/share/prims/forte.cpp https://openjdk.org/jeps/435 非公開API 問題もあり 公開APIにする動きあり
25 Java Flight Recorder サンプリング機能 © 2024 Fujitsu Limited 二種類のサンプリング
Method Profiling Sample Method Profiling Sample Native CPUで実行中あるいは実行キューにあるJavaコードが対象 以下はサンプリング対象外 JVMにより停止中のスレッド (block/wait/sleepなど) JVMコード実行中のスレッド (GCなど) CPUで実行中あるいは実行キューにあるネイティブコードが対象
26 JFR仕組み © 2024 Fujitsu Limited スレッドダンプAPIは使っていない セーフポイントバイアスはない (サンプリング時は) JVM(HostSpot)のSR機構を使いスレッドを停止
Linuxの場合は、SIGUSR2を使用 シンボル照合はセーフポイントバイアスになる -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints で緩和
27 JFRの実行ステップ © 2024 Fujitsu Limited サンプリング スタックトレース シンボルと照合 SIGUSR2/SuspendThread
AsyncGetCallTrace
28 perfコマンド © 2024 Fujitsu Limited アプリケーションから カーネル層まで対応 CPUイベントベース Java
VM(JIT)も対応
29 perfコマンドの実行ステップ © 2024 Fujitsu Limited サンプリング スタックトレース シンボルと照合 perf
event/PMUを利用 ネイティブ部分はELF。 Java部分は、別途JVMで シンボルマップの作成が必要 jcmd Compiler.perfmap FPベースのstack walk JVMで細工が必要 -XX:+PreserveFramePointer
30 async-profilerの実行ステップ © 2024 Fujitsu Limited サンプリング スタックトレース シンボルと照合 perf
event/PMUを利用 ネイティブ部分は、 FPベースのstack walk Java部分は、 AsyncGetCallTrace ネイティブ部分はELF
プロファイラの概要とバイアス バイアスの仕組み プロファイラの実態 バイアスへの対処 アジェンダ
32 メソッド・関数の種類 © 2024 Fujitsu Limited Javaコード インタプリタ JITコード 組込みコード
Java VMコード GCなど ネイティブコード ユーザスペース カーネルスペース
33 プロファイラ比較 © 2024 Fujitsu Limited VisualVM JFR perf async-
profiler safepoint bias サンプリング シンボル照合 N/A N/A Javaスタック インタプリタ は不可 組込みコード も可 ネイティブス タック カーネルス タック サポートOS ほぼすべて ほぼすべて Linux Linux/macOS
34 © 2024 Fujitsu Limited プロファイラの仕組みを知っておくと、 バイアスが想像しやすい 正しい結果ではなく、アクション可能な結果 サマリ プロファイラのバイアスは、排除するのは難しいので、
バイアスを知ったうえで、結果を活用する
© 2024 Fujitsu Limited Question? 35
Thank you © 2024 Fujitsu Limited