<div class="__aliyun_email_body_block"><div  style="font-family: Tahoma, Arial, STHeitiSC-Light, SimSun"><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span >I think it may be useful to add a tool which can print more information about the unmounted virtual threads after the JEP491.</span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span ><br ></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">I knew that the`jcmd <span >Thread.dump_to_file` cmd could generate a json/text file to give a view of the all the threads and virtual threads but it lacks information about the locks after JEP491.</span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">Our applications have used virtual threads (om pinned solved versions) <span >on a large scale of machines</span> and sometimes encounters deadlocks.</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">In practice, it is helpful to get the lock information about the unmounted threads <span  style="color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">to debug those deadlocks</span>. We add a jcmd tools to get this information: <span ><a  href="https://github.com/openjdk/jdk/pull/24405" target="_blank">https://github.com/openjdk/jdk/pull/24405</a></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="font-weight: 700;">May it be commited to the openjdk/loom?</span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><br ></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">The logic of the <span  style="color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">`jcmd ThreadAndVThread.dump`</span>:</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">1. get all threads and vthreads using a java call</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">2. print the stacktrace </div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">    2.1 print the javathread (including vt info) by a handshake<br ></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">    2.2 print the vthread</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">The way to get stack and lock information is like `jstack` impl.</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><br ></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">We choose this way to get information because</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">1. Our application developers are more familiar to the output generated by the jstack tools.</div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;">2. It's wired to call into the vm to get lock information for each vthread if we choose to implement this in the <span  style="color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">`jcmd </span><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Thread.dump_to_file` logic.</span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><br ></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Part of the output we get for the new tool `jcmd ThreadAndVThread.dump`:</span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br ></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></span><div  style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: Consolas, 'Courier New', monospace; font-weight: 400; font-size: 14px; line-height: 19px; white-space: pre;"><div ><span  style="color: rgb(163, 21, 21);">"vthread-3"</span><span  style="color: rgb(0, 0, 0);"> #</span><span  style="color: rgb(0, 0, 255);">48</span><span  style="color: rgb(0, 0, 0);"> Unmounted virtual thread</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.yield0(java.base@25-internal/Continuation.java:365)</span></div><div ><span  style="color: rgb(0, 0, 0);">  - parking to wait for  <</span><span  style="color: rgb(0, 0, 255);">0x000000011f7efe70</span><span  style="color: rgb(0, 0, 0);">> (a </span><span  style="color: rgb(0, 0, 255);">java.util.concurrent.locks.AbstractQueuedSynchronizer</span><span  style="color: rgb(0, 0, 0);">$ConditionObject)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.yield(java.base@25-internal/Continuation.java:357)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.yieldContinuation(java.base@25-internal/VirtualThread.java:543)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.park(java.base@25-internal/VirtualThread.java:746)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.System$1.parkVirtualThread(java.base@25-internal/System.java:2271)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.locks.LockSupport.park(java.base@25-internal/LockSupport.java:367)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@25-internal/AbstractQueuedSynchronizer.java:519)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@25-internal/ForkJoinPool.java:3945)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.ForkJoinPool.managedBlock(java.base@25-internal/ForkJoinPool.java:3891)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@25-internal/AbstractQueuedSynchronizer.java:1751)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.ProcessImpl.waitFor(java.base@25-internal/ProcessImpl.java:413)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.test.lib.process.OutputBuffer$LazyOutputBuffer.waitFor(OutputBuffer.java:162)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.test.lib.process.OutputAnalyzer.waitFor(OutputAnalyzer.java:117)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.test.lib.process.ProcessTools.executeProcess(ProcessTools.java:727)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.test.lib.process.ProcessTools.executeProcess(ProcessTools.java:695)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.test.lib.process.ProcessTools.executeProcess(ProcessTools.java:682)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread.lambda$main$3(TestJcmdDumpThreadAndVThread.java:73)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread$$Lambda/0x00007ff45b005000.run(Unknown Source)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Thread.runWith(java.base@25-internal/Thread.java:1460)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.run(java.base@25-internal/VirtualThread.java:466)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread$VThreadContinuation$1.run(java.base@25-internal/VirtualThread.java:258)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter0(java.base@25-internal/Continuation.java:325)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter(java.base@25-internal/Continuation.java:316)</span></div><br ><div ><span  style="color: rgb(163, 21, 21);">"vthread-0"</span><span  style="color: rgb(0, 0, 0);"> #</span><span  style="color: rgb(0, 0, 255);">44</span><span  style="color: rgb(0, 0, 0);"> Unmounted virtual thread</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Object.wait0(java.base@25-internal/Native Method)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Object.wait(java.base@25-internal/Object.java:382)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Object.wait(java.base@25-internal/Object.java:351)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread.lambda$main$0(TestJcmdDumpThreadAndVThread.java:31)</span></div><div ><span  style="color: rgb(0, 0, 0);">  - waiting to lock <</span><span  style="color: rgb(0, 0, 255);">0x000000011f5f7e00</span><span  style="color: rgb(0, 0, 0);">> (a TestJcmdDumpThreadAndVThread)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread$$Lambda/0x00007ff45b0018b0.run(Unknown Source)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Thread.runWith(java.base@25-internal/Thread.java:1460)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.run(java.base@25-internal/VirtualThread.java:466)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread$VThreadContinuation$1.run(java.base@25-internal/VirtualThread.java:258)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter0(java.base@25-internal/Continuation.java:325)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter(java.base@25-internal/Continuation.java:316)</span></div><br ><div ><span  style="color: rgb(163, 21, 21);">"vthread-1"</span><span  style="color: rgb(0, 0, 0);"> #</span><span  style="color: rgb(0, 0, 255);">46</span><span  style="color: rgb(0, 0, 0);"> Unmounted virtual thread</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.yield0(java.base@25-internal/Continuation.java:365)</span></div><div ><span  style="color: rgb(0, 0, 0);">  - parking to wait for  <</span><span  style="color: rgb(0, 0, 255);">0x000000011f5f80b8</span><span  style="color: rgb(0, 0, 0);">> (a </span><span  style="color: rgb(0, 0, 255);">java.util.concurrent.Semaphore</span><span  style="color: rgb(0, 0, 0);">$NonfairSync)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.yield(java.base@25-internal/Continuation.java:357)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.yieldContinuation(java.base@25-internal/VirtualThread.java:543)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.park(java.base@25-internal/VirtualThread.java:746)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.System$1.parkVirtualThread(java.base@25-internal/System.java:2271)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.locks.LockSupport.park(java.base@25-internal/LockSupport.java:221)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@25-internal/AbstractQueuedSynchronizer.java:789)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(java.base@25-internal/AbstractQueuedSynchronizer.java:1138)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.util.concurrent.Semaphore.acquire(java.base@25-internal/Semaphore.java:318)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread.lambda$main$1(TestJcmdDumpThreadAndVThread.java:41)</span></div><div ><span  style="color: rgb(0, 0, 0);">  - locked <</span><span  style="color: rgb(0, 0, 255);">0x000000011f5f7e00</span><span  style="color: rgb(0, 0, 0);">> (a TestJcmdDumpThreadAndVThread)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread$$Lambda/0x00007ff45b001ad8.run(Unknown Source)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Thread.runWith(java.base@25-internal/Thread.java:1460)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.run(java.base@25-internal/VirtualThread.java:466)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread$VThreadContinuation$1.run(java.base@25-internal/VirtualThread.java:258)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter0(java.base@25-internal/Continuation.java:325)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter(java.base@25-internal/Continuation.java:316)</span></div><br ><div ><span  style="color: rgb(163, 21, 21);">"vthread-2"</span><span  style="color: rgb(0, 0, 0);"> #</span><span  style="color: rgb(0, 0, 255);">47</span><span  style="color: rgb(0, 0, 0);"> Unmounted virtual thread</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread.lambda$main$2(TestJcmdDumpThreadAndVThread.java:56)</span></div><div ><span  style="color: rgb(0, 0, 0);">  - waiting to lock <</span><span  style="color: rgb(0, 0, 255);">0x000000011f5f7e00</span><span  style="color: rgb(0, 0, 0);">> (a TestJcmdDumpThreadAndVThread)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at TestJcmdDumpThreadAndVThread$$Lambda/0x00007ff45b001d00.run(Unknown Source)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.Thread.runWith(java.base@25-internal/Thread.java:1460)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread.run(java.base@25-internal/VirtualThread.java:466)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at java.lang.VirtualThread$VThreadContinuation$1.run(java.base@25-internal/VirtualThread.java:258)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter0(java.base@25-internal/Continuation.java:325)</span></div><div ><span  style="color: rgb(163, 21, 21); font-style: italic;">  at jdk.internal.vm.Continuation.enter(java.base@25-internal/Continuation.java:316)</span></div></div><div ></div><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br ></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br ></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br ></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><span  style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: rgb(0, 0, 0); font-family: Tahoma, Arial, STHeitiSC-Light, SimSun; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br ></span></div><div  style="clear: both; font-family: Tahoma, Arial, STHeitiSC-Light, SimSun;"><br ></div></div></div>