0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

仮想スレッドのスレッドダンプ採取方法

Posted at

仮想スレッドのスレッドダンプ採取方法

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?