Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

perfコマンド実行時におけるJavaのシンボルマップファイル生成方法

JDK 16以降は以下でOKです。

jcmd <PID> Compiler.perfmap

perf用ですのでこのコマンドはLinuxのみです。

これはAdd diagnostic command to write Linux perf map file で入りました。

JDK 8や11などのJDK 15以前だとjcmdにこのコマンドがありません。別途perf-map-agentを使います。

github.com

ビルドしてcreate-java-perf-map.sh <PID>を実行します。/tmp/perf-<pid>.mapファイルが生成されます。

-XX:+DumpPerfMapAtExit

JDK 16以降ではjcmd <PID> Compiler.perfmapの代わりに-XX:+DumpPerfMapAtExitオプションを使う方法もあります。以下のように使います。

perf record -- java -XX:+DumpPerfMapAtExit HelloWorld

JVMをシャットダウンする直前にマップファイルを生成してくれます。perfコマンド実行時にはJITコンパイルされたすべてのメソッドのシンボル名を確実にマップファイルに出力するように-XX:-UseCodeCacheFlushingを付与しますが、-XX:+DumpPerfMapAtExitを付与すると自動的にUseCodeCacheFlushingを無効にしてくれます(ソースコードでも確認)。明示的に-XX:+UseCodeCacheFlushingを付与するとこの自動的な設定を上書きしてフラッシュを有効にできます。

これはAdd -XX:+DumpPerfMapAtExit to write Linux perf map file on VM shutdown で入りました。