When we use jcmd <pid> Thread.dump/jstack <pid>, we could dump all Java thread stack trace, but unfortunately we are not able to print NonJavaThread stack trace such as VMThread/GCWorker, etc. For these threads, we know nothing about what are they doing/are they blocked in pthread condition from jstack output. An alternative is to use pstack, it internally attaches destination process and uses `thread apply all bt`, which introduces more overhead and much more dangerous.
====== JStack Ouput(Currrent) ... "ApplicationImpl pooled thread 441" #1478 prio=4 os_prio=31 cpu=11.71ms elapsed=60.30s tid=0x00007f8d32171000 nid=0x22f23 waiting on condition [0x0000700010d5d000] java.lang.Thread.State: TIMED_WAITING (parking) at jdk.internal.misc.Unsafe.park(java.base@11.0.11/Native Method) - parking to wait for <0x00000007af851760> (a java.util.concurrent.SynchronousQueue$TransferStack) at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.11/LockSupport.java:234) at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.base@11.0.11/SynchronousQueue.java:462) at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@11.0.11/SynchronousQueue.java:361) at java.util.concurrent.SynchronousQueue.poll(java.base@11.0.11/SynchronousQueue.java:937) at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.11/ThreadPoolExecutor.java:1053) at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.11/ThreadPoolExecutor.java:1114) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.11/ThreadPoolExecutor.java:628) at java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(java.base@11.0.11/Executors.java:668) at java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(java.base@11.0.11/Executors.java:665) at java.security.AccessController.doPrivileged(java.base@11.0.11/Native Method) at java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(java.base@11.0.11/Executors.java:665) at java.lang.Thread.run(java.base@11.0.11/Thread.java:829) "VM Thread" os_prio=31 cpu=31205.83ms elapsed=154131.15s tid=0x00007f8d49046000 nid=0x4703 runnable "GC Thread#0" os_prio=31 cpu=3811.96ms elapsed=154131.18s tid=0x00007f8d49809800 nid=0x3603 runnable "GC Thread#1" os_prio=31 cpu=3749.09ms elapsed=154130.24s tid=0x00007f8d4a9b3000 nid=0x6103 runnable "GC Thread#2" os_prio=31 cpu=3745.73ms elapsed=154129.74s tid=0x00007f8d48249000 nid=0x12f27 runnable "GC Thread#3" os_prio=31 cpu=3692.77ms elapsed=154129.74s tid=0x00007f8d48b93000 nid=0xe50b runnable "GC Thread#4" os_prio=31 cpu=3728.57ms elapsed=154129.74s tid=0x00007f8d47b0b000 nid=0xe603 runnable "GC Thread#5" os_prio=31 cpu=3726.08ms elapsed=154129.74s tid=0x00007f8d47afc800 nid=0xe803 runnable "GC Thread#6" os_prio=31 cpu=3660.35ms elapsed=154129.02s tid=0x00007f8d48de5800 nid=0x15d2f runnable "GC Thread#7" os_prio=31 cpu=3676.68ms elapsed=154129.02s tid=0x00007f8d48dc4800 nid=0x16103 runnable "GC Thread#8" os_prio=31 cpu=3676.15ms elapsed=154128.31s tid=0x00007f8d4849d800 nid=0x1f503 runnable "GC Thread#9" os_prio=31 cpu=3570.95ms elapsed=154128.31s tid=0x00007f8d494ab000 nid=0x1f303 runnable "CMS Main Thread" os_prio=31 cpu=6715.33ms elapsed=154131.18s tid=0x00007f8d4780f800 nid=0x4b03 runnable "CMS Thread#0" os_prio=31 cpu=2429.86ms elapsed=154131.18s tid=0x00007f8d4900e000 nid=0x3703 runnable "CMS Thread#1" os_prio=31 cpu=2422.35ms elapsed=154129.72s tid=0x00007f8d4d044000 nid=0x11a03 runnable "CMS Thread#2" os_prio=31 cpu=2418.81ms elapsed=154129.72s tid=0x00007f8d48b93800 nid=0xea03 runnable "VM Periodic Task Thread" os_prio=31 cpu=10658.80ms elapsed=154130.41s tid=0x00007f8d49035000 nid=0xa003 waiting on condition JNI global refs: 660, weak refs: 1217 Most of above information makes no sense for further debugging. I think we can extend this functionality, e.g. add a new flag such as DumpAllThreadStackTrace, to print non java thread stack trace: ====== JStack Ouput(Modified) 2022-03-16 10:33:49 Full thread dump OpenJDK 64-Bit Server VM (19-internal-adhoc.qingfengyy.jdktip mixed mode, sharing): Threads class SMR info: _java_thread_list=0x00007fc0900015f0, length=15, elements={ 0x00007fc1281babd0, 0x00007fc1281bc190, 0x00007fc1281c21e0, 0x00007fc1281c36b0, 0x00007fc1281c4bc0, 0x00007fc1281c6740, 0x00007fc1281c7dc0, 0x00007fc1281c9340, 0x00007fc1281f8a70, 0x00007fc128209120, 0x00007fc12823ea50, 0x00007fc12823fb80, 0x00007fc128246f20, 0x00007fc1280255c0, 0x00007fc090000be0 } "Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.11ms elapsed=12.11s tid=0x00007fc1281babd0 nid=91395 waiting on condition [0x00007fc0b6877000] java.lang.Thread.State: RUNNABLE at java.lang.ref.Reference.waitForReferencePendingList(java.base@19-internal/Native Method) at java.lang.ref.Reference.processPendingReferences(java.base@19-internal/Reference.java:253) at java.lang.ref.Reference$ReferenceHandler.run(java.base@19-internal/Reference.java:215) "Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.31ms elapsed=12.11s tid=0x00007fc1281bc190 nid=91396 in Object.wait() [0x00007fc0b6776000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(java.base@19-internal/Native Method) - waiting on <0x00000000a00027c0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(java.base@19-internal/ReferenceQueue.java:155) - locked <0x00000000a00027c0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(java.base@19-internal/ReferenceQueue.java:176) at java.lang.ref.Finalizer$FinalizerThread.run(java.base@19-internal/Finalizer.java:183) "Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.29ms elapsed=12.10s tid=0x00007fc1281c21e0 nid=91397 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Service Thread" #5 daemon prio=9 os_prio=0 cpu=0.07ms elapsed=12.10s tid=0x00007fc1281c36b0 nid=91398 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Monitor Deflation Thread" #6 daemon prio=9 os_prio=0 cpu=0.17ms elapsed=12.10s tid=0x00007fc1281c4bc0 nid=91399 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" #7 daemon prio=9 os_prio=0 cpu=19.05ms elapsed=12.10s tid=0x00007fc1281c6740 nid=91400 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE No compile task "C1 CompilerThread0" #19 daemon prio=9 os_prio=0 cpu=38.05ms elapsed=12.10s tid=0x00007fc1281c7dc0 nid=91401 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE No compile task "Sweeper thread" #25 daemon prio=9 os_prio=0 cpu=0.04ms elapsed=12.10s tid=0x00007fc1281c9340 nid=91402 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Notification Thread" #26 daemon prio=9 os_prio=0 cpu=0.06ms elapsed=12.09s tid=0x00007fc1281f8a70 nid=91409 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Common-Cleaner" #27 daemon prio=8 os_prio=0 cpu=0.12ms elapsed=12.08s tid=0x00007fc128209120 nid=91413 in Object.wait() [0x00007fc0b5948000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(java.base@19-internal/Native Method) - waiting on <0x00000000a010aba8> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(java.base@19-internal/ReferenceQueue.java:155) - locked <0x00000000a010aba8> (a java.lang.ref.ReferenceQueue$Lock) at jdk.internal.ref.CleanerImpl.run(java.base@19-internal/CleanerImpl.java:140) at java.lang.Thread.run(java.base@19-internal/Thread.java:828) at jdk.internal.misc.InnocuousThread.run(java.base@19-internal/InnocuousThread.java:162) "server-timer" #28 daemon prio=5 os_prio=0 cpu=0.23ms elapsed=12.03s tid=0x00007fc12823ea50 nid=91418 in Object.wait() [0x00007fc0b5847000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(java.base@19-internal/Native Method) - waiting on <0x00000000a01ff400> (a java.util.TaskQueue) at java.util.TimerThread.mainLoop(java.base@19-internal/Timer.java:563) - locked <0x00000000a01ff400> (a java.util.TaskQueue) at java.util.TimerThread.run(java.base@19-internal/Timer.java:516) "server-timer1" #29 daemon prio=5 os_prio=0 cpu=0.81ms elapsed=12.03s tid=0x00007fc12823fb80 nid=91419 in Object.wait() [0x00007fc0b5746000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(java.base@19-internal/Native Method) - waiting on <0x00000000a01ffa98> (a java.util.TaskQueue) at java.util.TimerThread.mainLoop(java.base@19-internal/Timer.java:563) - locked <0x00000000a01ffa98> (a java.util.TaskQueue) at java.util.TimerThread.run(java.base@19-internal/Timer.java:516) "HTTP-Dispatcher" #30 prio=5 os_prio=0 cpu=0.98ms elapsed=12.02s tid=0x00007fc128246f20 nid=91421 runnable [0x00007fc0b5645000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPoll.wait(java.base@19-internal/Native Method) at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@19-internal/EPollSelectorImpl.java:118) at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@19-internal/SelectorImpl.java:129) - locked <0x00000000a01fc928> (a sun.nio.ch.Util$2) - locked <0x00000000a01fc598> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(java.base@19-internal/SelectorImpl.java:141) at sun.net.httpserver.ServerImpl$Dispatcher.run(jdk.httpserver@19-internal/ServerImpl.java:373) at java.lang.Thread.run(java.base@19-internal/Thread.java:828) "DestroyJavaVM" #31 prio=5 os_prio=0 cpu=108.15ms elapsed=12.01s tid=0x00007fc1280255c0 nid=91386 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Attach Listener" #32 daemon prio=9 os_prio=0 cpu=0.18ms elapsed=0.10s tid=0x00007fc090000be0 nid=91781 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "VM Thread" os_prio=0 cpu=0.63ms elapsed=12.11s tid=0x00007fc1281b7900 nid=91394 runnable Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 "GC Thread#0" os_prio=0 cpu=0.11ms elapsed=12.12s tid=0x00007fc128066a20 nid=91387 runnable Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xf4a977] WorkerThreads::threads_do(ThreadClosure*) const+0x37 V [libjvm.so+0x70cf16] G1CollectedHeap::gc_threads_do(ThreadClosure*) const+0x16 V [libjvm.so+0xe98624] Threads::print_on(outputStream*, bool, bool, bool, bool)+0x4a4 V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 "G1 Main Marker" os_prio=0 cpu=0.03ms elapsed=12.12s tid=0x00007fc128076ee0 nid=91388 runnable Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0x70cf26] G1CollectedHeap::gc_threads_do(ThreadClosure*) const+0x26 V [libjvm.so+0xe98624] Threads::print_on(outputStream*, bool, bool, bool, bool)+0x4a4 V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 "G1 Conc#0" os_prio=0 cpu=0.02ms elapsed=12.12s tid=0x00007fc128077f60 nid=91389 runnable Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xf4a977] WorkerThreads::threads_do(ThreadClosure*) const+0x37 V [libjvm.so+0x70cf35] G1CollectedHeap::gc_threads_do(ThreadClosure*) const+0x35 V [libjvm.so+0xe98624] Threads::print_on(outputStream*, bool, bool, bool, bool)+0x4a4 V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 "G1 Refine#0" os_prio=0 cpu=0.03ms elapsed=12.13s tid=0x00007fc1281881e0 nid=91390 runnable Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0x7275c8] G1ConcurrentRefine::threads_do(ThreadClosure*)+0x78 V [libjvm.so+0x70cf44] G1CollectedHeap::gc_threads_do(ThreadClosure*) const+0x44 V [libjvm.so+0xe98624] Threads::print_on(outputStream*, bool, bool, bool, bool)+0x4a4 V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 "G1 Service" os_prio=0 cpu=0.71ms elapsed=12.13s tid=0x00007fc1281892a0 nid=91391 runnable Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xe98624] Threads::print_on(outputStream*, bool, bool, bool, bool)+0x4a4 V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 "VM Periodic Task Thread" os_prio=0 cpu=2.22ms elapsed=12.10s tid=0x00007fc1281fa560 nid=91410 waiting on condition Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [libjvm.so+0xf21da5] VM_PrintThreads::doit()+0x25 V [libjvm.so+0xf2248a] VM_Operation::evaluate()+0xea V [libjvm.so+0xf23df8] VMThread::evaluate_operation(VM_Operation*)+0xb8 V [libjvm.so+0xf244a7] VMThread::inner_execute(VM_Operation*)+0x3a7 V [libjvm.so+0xf24757] VMThread::run()+0xb7 V [libjvm.so+0xe99680] Thread::call_run()+0xc0 V [libjvm.so+0xc379f8] thread_native_entry(Thread*)+0xd8 JNI global refs: 28, weak refs: 0 ------------- Commit messages: - 8283147: Include NonJavaThread stacktrace during thread dump Changes: https://git.openjdk.java.net/jdk/pull/7833/files Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=7833&range=00 Issue: https://bugs.openjdk.java.net/browse/JDK-8283147 Stats: 46 lines in 4 files changed: 39 ins; 6 del; 1 mod Patch: https://git.openjdk.java.net/jdk/pull/7833.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/7833/head:pull/7833 PR: https://git.openjdk.java.net/jdk/pull/7833