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を使います。
ビルドして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 で入りました。