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

出典

作成日時: 2026-08-11 22:36 / 更新日時: 2026-08-11 22:36