async-profiler
HotSpotベースのJVM向け低オーバーヘッド・サンプリングプロファイラ。JVMTIに依存せず、Safepoint bias問題を回避する設計になっている。
Safepoint biasの回避
従来のJavaプロファイラの多くはJVMTIのGetStackTraceを使うが、これはJVMのセーフポイントでしかスタックを取得できず、実際にはホットではないコードパスが過剰に計測される「Safepoint bias」というバイアスが生じる。async-profilerはHotSpot固有のAPIであるAsyncGetCallTraceと、Linuxのperf_eventsを組み合わせて使うことで、Javaスレッドだけでなく GC・JITコンパイラなどのネイティブスレッドも含めて、任意の地点でスタックを取得できる。
プロファイリング対象
- CPU時間
- Javaヒープ上のメモリアロケーション
- ネイティブメモリ確保・リーク検出
- ロック競合
- キャッシュミス・ページフォルトなどのハードウェアパフォーマンスカウンタ
バイトコード計装やDTraceプローブのような侵襲的な手法を使わないため、Escape AnalysisやJITの最適化(アロケーション除去など)を妨げない。
使い方
asprof -d 30 -f flamegraph.html <PID>
対象PIDを30秒間プロファイリングし、結果をインタラクティブなフレームグラフとしてHTMLファイルに出力する。JFR(Java Flight Recorder)形式での出力にも対応する。
IntelliJ IDEAのProfilerも内部でasync-profilerを使用している。
#java #jvm #performance #profiling