仮想スレッドのスレッドダンプ採取方法
JDK21で仮想スレッドが導入されました。
この仮想スレッドのスレッドダンプを採取するには jcmd の Thread.dump_to_file コマンドを使用します。
Thread.dump_to_file コマンドは以下の形式で指定します。
jcmd <プロセスID> Thread.dump_to_file [-overwrite] [-format={text,json}] <ファイルパス>
オプション -overwrite は出力ファイルを上書きします。
このオプションをつけない場合、出力ファイルが存在するとエラーになります。
オプション -format は出力形式をテキスト形式(text)、またはJSON形式(json)にします。デフォルトは text です。
従来のスレッドダンプ採取方法である kill -QUIT や jcmd Thread.print では採取できません。スレッドダンプは出力されますが、仮想スレッドに関する情報は出力されません。
出力例
テキスト形式での出力例(抜粋)
orange >> jcmd 4442 Thread.dump_to_file -format=text -overwrite thread.log
4442:
Created /root/thread.log
orange >> more thread.log
....
#18 "" virtual
java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:640)
java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:817)
.....
#29 "" virtual
java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:640)
java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:817)
.....
JSON形式での出力例(抜粋)
orange >> jcmd 4504 Thread.dump_to_file -format=json -overwrite thread2.log
4504:
Created /root/thread2.log
orange >> more thread2.log
.....
{
"container": "java.util.concurrent.ThreadPerTaskExecutor@521b83de",
"parent": "<root>",
"owner": null,
"threads": [
{
"tid": "18",
"name": "",
"stack": [
"java.base\/java.lang.VirtualThread.parkNanos(VirtualThread.java:640)",
"java.base\/java.lang.VirtualThread.sleepNanos(VirtualThread.java:817)",
"java.base\/java.lang.Thread.sleepNanos(Thread.java:494)",
"java.base\/java.lang.Thread.sleep(Thread.java:527)",
"vthread7.lambda$main$0(vthread7.java:12)",
"java.base\/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)",
"java.base\/java.util.concurrent.FutureTask.run(FutureTask.java:317)",
"java.base\/java.lang.VirtualThread.run(VirtualThread.java:329)"
]
},
{
"tid": "20",
"name": "",
"stack": [
"java.base\/java.lang.VirtualThread.parkNanos(VirtualThread.java:640)",
"java.base\/java.lang.VirtualThread.sleepNanos(VirtualThread.java:817)",
....
openjdk version "23" で確認
参考
JEP 444: Virtual Threads https://openjdk.org/jeps/444
jcmdコマンド https://docs.oracle.com/javase/jp/22/docs/specs/man/jcmd.html