Closed alexmenkov closed 6 months ago
I am not able to reproduce it. Where is 'heap dump contains virtual threads'?
I've attached sample hprof file which contains virtual threads
Thanks, I will take a look.
I fixed NPE. In attached heap dump I now see two entries for Virtual thread [#29]/runnable@ForkJoinPool-1-worker-1
. The first is in the middle with stack trace and the second is the last without stack trace. This look strange to me. Can you confirm that the attached heap dump is correct?
"main" prio=5 tid=1 TIMED_WAITING
at java.lang.Thread.sleepNanos0(Native Method)
at java.lang.Thread.sleepNanos(Thread.java:491)
local variable: java.lang.Thread#2
at java.lang.Thread.sleep(Thread.java:522)
at jdk.test.lib.apps.LingeredApp.main(LingeredApp.java:630)
local variable: java.lang.String[]#22
local variable: java.lang.String#2561
local variable: sun.nio.fs.WindowsPath#1
local variable: jdk.test.lib.apps.LingeredApp$SteadyStateLock#1
local variable: jdk.test.lib.apps.LingeredApp$SteadyStateLock#1
at MyTest2Targ.runTest(MyTest2.java:148)
local variable: MyTest2Targ#1
local variable: java.lang.String[]#22
local variable: MyTest2Targ$VthreadMounted#1
local variable: MyTest2Targ$Pthread#1
at MyTest2Targ.main(MyTest2.java:159)
local variable: java.lang.String[]#22
local variable: MyTest2Targ#1
"Reference Handler" daemon prio=10 tid=9 RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(Native Method)
at java.lang.ref.Reference.processPendingReferences(Reference.java:246)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:208)
local variable: java.lang.ref.Reference$ReferenceHandler#1
"Finalizer" daemon prio=8 tid=10 WAITING
at java.lang.Object.wait0(Native Method)
at java.lang.Object.wait(Object.java:375)
local variable: java.lang.ref.NativeReferenceQueue$Lock#1
at java.lang.Object.wait(Object.java:348)
local variable: java.lang.ref.NativeReferenceQueue$Lock#1
at java.lang.ref.NativeReferenceQueue.await(NativeReferenceQueue.java:48)
local variable: java.lang.ref.NativeReferenceQueue#1
at java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:158)
local variable: java.lang.ref.NativeReferenceQueue#1
at java.lang.ref.NativeReferenceQueue.remove(NativeReferenceQueue.java:89)
local variable: java.lang.ref.NativeReferenceQueue#1
local variable: java.lang.ref.NativeReferenceQueue$Lock#1
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:173)
local variable: java.lang.ref.Finalizer$FinalizerThread#1
local variable: java.lang.System$2#1
"Signal Dispatcher" daemon prio=9 tid=11 RUNNABLE
"Attach Listener" daemon prio=5 tid=12 RUNNABLE
"Notification Thread" daemon prio=9 tid=19 RUNNABLE
"Common-Cleaner" daemon prio=8 tid=20 TIMED_WAITING
at jdk.internal.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:269)
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject#6
local variable: jdk.internal.misc.InnocuousThread#1
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1847)
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject#6
local variable: java.util.concurrent.TimeUnit#3
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode#1
at java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:71)
local variable: java.lang.ref.ReferenceQueue#4
at java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:143)
local variable: java.lang.ref.ReferenceQueue#4
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:218)
local variable: java.lang.ref.ReferenceQueue#4
at jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
local variable: jdk.internal.ref.CleanerImpl#1
local variable: jdk.internal.misc.InnocuousThread#1
local variable: jdk.internal.misc.InnocuousThread#1
at java.lang.Thread.runWith(Thread.java:1583)
local variable: jdk.internal.misc.InnocuousThread#1
local variable: class java.lang.Thread
local variable: jdk.internal.ref.CleanerImpl#1
at java.lang.Thread.run(Thread.java:1570)
local variable: jdk.internal.misc.InnocuousThread#1
local variable: jdk.internal.ref.CleanerImpl#1
local variable: class java.lang.Thread
at jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:186)
local variable: jdk.internal.misc.InnocuousThread#1
Virtual Thread [#29]/runnable@ForkJoinPool-1-worker-1
at MyTest2Targ$VthreadMounted.run(MyTest2.java:99)
local variable: MyTest2Targ$VthreadMounted#1
local variable: MyTest2Targ$VThreadMountedReferenced#1
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.VirtualThread#6
local variable: class java.lang.Thread
local variable: MyTest2Targ$VthreadMounted#1
at java.lang.VirtualThread.run(VirtualThread.java:321)
local variable: java.lang.VirtualThread#6
local variable: MyTest2Targ$VthreadMounted#1
local variable: class java.lang.Thread
at java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:201)
local variable: java.lang.VirtualThread$VThreadContinuation$1#6
at jdk.internal.vm.Continuation.enter0(Continuation.java:320)
local variable: java.lang.VirtualThread$VThreadContinuation#6
at jdk.internal.vm.Continuation.enter(Continuation.java:312)
local variable: java.lang.VirtualThread$VThreadContinuation#6
"ForkJoinPool-1-worker-1" daemon prio=5 tid=22 RUNNABLE
at jdk.internal.vm.Continuation.run(Continuation.java:248)
local variable: java.lang.VirtualThread$VThreadContinuation#6
local variable: jdk.internal.misc.CarrierThread#1
at java.lang.VirtualThread.runContinuation(VirtualThread.java:237)
local variable: java.lang.VirtualThread#6
at java.lang.VirtualThread$$Lambda+0x00000248a6057a28.run(<unresolved string 0x0>)
local variable: java.lang.VirtualThread$$Lambda+0x00000248a6057a28#6
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1726)
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1717)
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
at java.util.concurrent.ForkJoinTask$InterruptibleTask.exec(ForkJoinTask.java:1641)
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
local variable: jdk.internal.misc.CarrierThread#1
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1491)
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#2
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#1
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:2073)
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue[]#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#1
local variable: java.util.concurrent.ForkJoinTask[]#1
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
local variable: java.util.concurrent.ForkJoinTask$RunnableExecuteAction#1
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2035)
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#2
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
local variable: jdk.internal.misc.CarrierThread#1
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#2
"ForkJoinPool-1-worker-2" daemon prio=5 tid=23 WAITING
at jdk.internal.misc.Unsafe.park(Native Method)
at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:2145)
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#3
local variable: java.util.concurrent.ForkJoinPool$WorkQueue[]#2
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2036)
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#3
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
local variable: jdk.internal.misc.CarrierThread#2
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#3
"ForkJoinPool-1-worker-3" daemon prio=5 tid=24 WAITING
at jdk.internal.misc.Unsafe.park(Native Method)
at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:2145)
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#4
local variable: java.util.concurrent.ForkJoinPool$WorkQueue[]#2
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2036)
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#4
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
local variable: jdk.internal.misc.CarrierThread#3
local variable: java.util.concurrent.ForkJoinPool#2
local variable: java.util.concurrent.ForkJoinPool$WorkQueue#4
"Thread-0" prio=5 tid=30 WAITING
at jdk.internal.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:221)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.lang.Thread#1
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#6
local variable: java.lang.Thread#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#5
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#6
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1099)
local variable: java.util.concurrent.CountDownLatch$Sync#1
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
local variable: java.util.concurrent.CountDownLatch#1
at MyTest2Targ.awaitToStop(MyTest2.java:121)
local variable: MyTest2Targ#1
at MyTest2Targ$Pthread.run(MyTest2.java:111)
local variable: MyTest2Targ$Pthread#1
local variable: MyTest2Targ$PThreadReferenced#1
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.Thread#1
local variable: class java.lang.Thread
local variable: MyTest2Targ$Pthread#1
at java.lang.Thread.run(Thread.java:1570)
local variable: java.lang.Thread#1
local variable: MyTest2Targ$Pthread#1
local variable: class java.lang.Thread
"SteadyStateThread" prio=5 tid=31 BLOCKED
at jdk.test.lib.apps.LingeredApp.steadyState(LingeredApp.java:567)
local variable: jdk.test.lib.apps.LingeredApp$SteadyStateLock#1
local variable: jdk.test.lib.apps.LingeredApp$SteadyStateLock#1
at jdk.test.lib.apps.LingeredApp$1.run(LingeredApp.java:573)
local variable: jdk.test.lib.apps.LingeredApp$1#1
Virtual Thread [#21]/parking
at jdk.internal.vm.Continuation.yield0(Continuation.java:360)
local variable: java.lang.VirtualThread$VThreadContinuation#1
local variable: jdk.internal.vm.ContinuationScope#1
at jdk.internal.vm.Continuation.yield(Continuation.java:351)
local variable: jdk.internal.vm.ContinuationScope#1
local variable: java.lang.VirtualThread$VThreadContinuation#1
local variable: java.lang.VirtualThread$VThreadContinuation#1
at java.lang.VirtualThread.yieldContinuation(VirtualThread.java:441)
local variable: java.lang.VirtualThread#1
at java.lang.VirtualThread.park(VirtualThread.java:588)
local variable: java.lang.VirtualThread#1
at java.lang.System$2.parkVirtualThread(System.java:2643)
local variable: java.lang.System$2#1
local variable: java.lang.VirtualThread#1
local variable: java.lang.VirtualThread#1
at jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:219)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.lang.VirtualThread#1
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#1
local variable: java.lang.VirtualThread#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$ExclusiveNode#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#1
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1099)
local variable: java.util.concurrent.CountDownLatch$Sync#1
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
local variable: java.util.concurrent.CountDownLatch#1
at MyTest2Targ.awaitToStop(MyTest2.java:121)
local variable: MyTest2Targ#1
at MyTest2Targ$VthreadUnmounted.run(MyTest2.java:86)
local variable: MyTest2Targ$VthreadUnmounted#1
local variable: MyTest2Targ$VThreadUnmountedReferenced#1
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.VirtualThread#1
local variable: class java.lang.Thread
local variable: MyTest2Targ$VthreadUnmounted#1
at java.lang.VirtualThread.run(VirtualThread.java:321)
local variable: java.lang.VirtualThread#1
local variable: MyTest2Targ$VthreadUnmounted#1
local variable: class java.lang.Thread
at java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:201)
local variable: java.lang.VirtualThread$VThreadContinuation$1#1
at jdk.internal.vm.Continuation.enter0(Continuation.java:320)
local variable: java.lang.VirtualThread$VThreadContinuation#1
at jdk.internal.vm.Continuation.enter(Continuation.java:312)
local variable: java.lang.VirtualThread$VThreadContinuation#1
Virtual Thread [#25]/parking
at jdk.internal.vm.Continuation.yield0(Continuation.java:360)
local variable: java.lang.VirtualThread$VThreadContinuation#2
local variable: jdk.internal.vm.ContinuationScope#1
at jdk.internal.vm.Continuation.yield(Continuation.java:351)
local variable: jdk.internal.vm.ContinuationScope#1
local variable: java.lang.VirtualThread$VThreadContinuation#2
local variable: java.lang.VirtualThread$VThreadContinuation#2
at java.lang.VirtualThread.yieldContinuation(VirtualThread.java:441)
local variable: java.lang.VirtualThread#2
at java.lang.VirtualThread.park(VirtualThread.java:588)
local variable: java.lang.VirtualThread#2
at java.lang.System$2.parkVirtualThread(System.java:2643)
local variable: java.lang.System$2#1
local variable: java.lang.VirtualThread#2
local variable: java.lang.VirtualThread#2
at jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:219)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.lang.VirtualThread#2
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#2
local variable: java.lang.VirtualThread#2
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#2
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1099)
local variable: java.util.concurrent.CountDownLatch$Sync#1
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
local variable: java.util.concurrent.CountDownLatch#1
at MyTest2Targ.awaitToStop(MyTest2.java:121)
local variable: MyTest2Targ#1
at MyTest2Targ$VthreadUnmounted.run(MyTest2.java:86)
local variable: MyTest2Targ$VthreadUnmounted#2
local variable: MyTest2Targ$VThreadUnmountedReferenced#2
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.VirtualThread#2
local variable: class java.lang.Thread
local variable: MyTest2Targ$VthreadUnmounted#2
at java.lang.VirtualThread.run(VirtualThread.java:321)
local variable: java.lang.VirtualThread#2
local variable: MyTest2Targ$VthreadUnmounted#2
local variable: class java.lang.Thread
at java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:201)
local variable: java.lang.VirtualThread$VThreadContinuation$1#2
at jdk.internal.vm.Continuation.enter0(Continuation.java:320)
local variable: java.lang.VirtualThread$VThreadContinuation#2
at jdk.internal.vm.Continuation.enter(Continuation.java:312)
local variable: java.lang.VirtualThread$VThreadContinuation#2
Virtual Thread [#26]/parking
at jdk.internal.vm.Continuation.yield0(Continuation.java:360)
local variable: java.lang.VirtualThread$VThreadContinuation#3
local variable: jdk.internal.vm.ContinuationScope#1
at jdk.internal.vm.Continuation.yield(Continuation.java:351)
local variable: jdk.internal.vm.ContinuationScope#1
local variable: java.lang.VirtualThread$VThreadContinuation#3
local variable: java.lang.VirtualThread$VThreadContinuation#3
at java.lang.VirtualThread.yieldContinuation(VirtualThread.java:441)
local variable: java.lang.VirtualThread#3
at java.lang.VirtualThread.park(VirtualThread.java:588)
local variable: java.lang.VirtualThread#3
at java.lang.System$2.parkVirtualThread(System.java:2643)
local variable: java.lang.System$2#1
local variable: java.lang.VirtualThread#3
local variable: java.lang.VirtualThread#3
at jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:219)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.lang.VirtualThread#3
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#3
local variable: java.lang.VirtualThread#3
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#2
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#3
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1099)
local variable: java.util.concurrent.CountDownLatch$Sync#1
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
local variable: java.util.concurrent.CountDownLatch#1
at MyTest2Targ.awaitToStop(MyTest2.java:121)
local variable: MyTest2Targ#1
at MyTest2Targ$VthreadUnmounted.run(MyTest2.java:86)
local variable: MyTest2Targ$VthreadUnmounted#3
local variable: MyTest2Targ$VThreadUnmountedReferenced#3
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.VirtualThread#3
local variable: class java.lang.Thread
local variable: MyTest2Targ$VthreadUnmounted#3
at java.lang.VirtualThread.run(VirtualThread.java:321)
local variable: java.lang.VirtualThread#3
local variable: MyTest2Targ$VthreadUnmounted#3
local variable: class java.lang.Thread
at java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:201)
local variable: java.lang.VirtualThread$VThreadContinuation$1#3
at jdk.internal.vm.Continuation.enter0(Continuation.java:320)
local variable: java.lang.VirtualThread$VThreadContinuation#3
at jdk.internal.vm.Continuation.enter(Continuation.java:312)
local variable: java.lang.VirtualThread$VThreadContinuation#3
Virtual Thread [#27]/parking
at jdk.internal.vm.Continuation.yield0(Continuation.java:360)
local variable: java.lang.VirtualThread$VThreadContinuation#4
local variable: jdk.internal.vm.ContinuationScope#1
at jdk.internal.vm.Continuation.yield(Continuation.java:351)
local variable: jdk.internal.vm.ContinuationScope#1
local variable: java.lang.VirtualThread$VThreadContinuation#4
local variable: java.lang.VirtualThread$VThreadContinuation#4
at java.lang.VirtualThread.yieldContinuation(VirtualThread.java:441)
local variable: java.lang.VirtualThread#4
at java.lang.VirtualThread.park(VirtualThread.java:588)
local variable: java.lang.VirtualThread#4
at java.lang.System$2.parkVirtualThread(System.java:2643)
local variable: java.lang.System$2#1
local variable: java.lang.VirtualThread#4
local variable: java.lang.VirtualThread#4
at jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:219)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.lang.VirtualThread#4
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#4
local variable: java.lang.VirtualThread#4
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#3
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#4
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1099)
local variable: java.util.concurrent.CountDownLatch$Sync#1
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
local variable: java.util.concurrent.CountDownLatch#1
at MyTest2Targ.awaitToStop(MyTest2.java:121)
local variable: MyTest2Targ#1
at MyTest2Targ$VthreadUnmounted.run(MyTest2.java:86)
local variable: MyTest2Targ$VthreadUnmounted#4
local variable: MyTest2Targ$VThreadUnmountedReferenced#4
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.VirtualThread#4
local variable: class java.lang.Thread
local variable: MyTest2Targ$VthreadUnmounted#4
at java.lang.VirtualThread.run(VirtualThread.java:321)
local variable: java.lang.VirtualThread#4
local variable: MyTest2Targ$VthreadUnmounted#4
local variable: class java.lang.Thread
at java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:201)
local variable: java.lang.VirtualThread$VThreadContinuation$1#4
at jdk.internal.vm.Continuation.enter0(Continuation.java:320)
local variable: java.lang.VirtualThread$VThreadContinuation#4
at jdk.internal.vm.Continuation.enter(Continuation.java:312)
local variable: java.lang.VirtualThread$VThreadContinuation#4
Virtual Thread [#28]/parking
at jdk.internal.vm.Continuation.yield0(Continuation.java:360)
local variable: java.lang.VirtualThread$VThreadContinuation#5
local variable: jdk.internal.vm.ContinuationScope#1
at jdk.internal.vm.Continuation.yield(Continuation.java:351)
local variable: jdk.internal.vm.ContinuationScope#1
local variable: java.lang.VirtualThread$VThreadContinuation#5
local variable: java.lang.VirtualThread$VThreadContinuation#5
at java.lang.VirtualThread.yieldContinuation(VirtualThread.java:441)
local variable: java.lang.VirtualThread#5
at java.lang.VirtualThread.park(VirtualThread.java:588)
local variable: java.lang.VirtualThread#5
at java.lang.System$2.parkVirtualThread(System.java:2643)
local variable: java.lang.System$2#1
local variable: java.lang.VirtualThread#5
local variable: java.lang.VirtualThread#5
at jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:219)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.lang.VirtualThread#5
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754)
local variable: java.util.concurrent.CountDownLatch$Sync#1
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#5
local variable: java.lang.VirtualThread#5
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#4
local variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$SharedNode#5
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1099)
local variable: java.util.concurrent.CountDownLatch$Sync#1
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
local variable: java.util.concurrent.CountDownLatch#1
at MyTest2Targ.awaitToStop(MyTest2.java:121)
local variable: MyTest2Targ#1
at MyTest2Targ$VthreadUnmounted.run(MyTest2.java:86)
local variable: MyTest2Targ$VthreadUnmounted#5
local variable: MyTest2Targ$VThreadUnmountedReferenced#5
at java.lang.Thread.runWith(Thread.java:1583)
local variable: java.lang.VirtualThread#5
local variable: class java.lang.Thread
local variable: MyTest2Targ$VthreadUnmounted#5
at java.lang.VirtualThread.run(VirtualThread.java:321)
local variable: java.lang.VirtualThread#5
local variable: MyTest2Targ$VthreadUnmounted#5
local variable: class java.lang.Thread
at java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:201)
local variable: java.lang.VirtualThread$VThreadContinuation$1#5
at jdk.internal.vm.Continuation.enter0(Continuation.java:320)
local variable: java.lang.VirtualThread$VThreadContinuation#5
at jdk.internal.vm.Continuation.enter(Continuation.java:312)
local variable: java.lang.VirtualThread$VThreadContinuation#5
Virtual Thread [#29]/runnable@ForkJoinPool-1-worker-1
@thurka The thread dump looks good. Duplicate of the Virtual thread [#29] is bug in the JDK heap dumper. Will fix it.
Will fix it.
Great. I want to separate normal and virual threads in threads view (or create separate virtual threads view).
NPE fixed in master.
JDK 22 adds support of virtual threads in heap dumps (thread objects/stack traces/stack references): https://bugs.openjdk.org/browse/JDK-8316691 https://bugs.openjdk.org/browse/JDK-8299426
VisualVM fails to show threads if heap dump contains virtual threads:
The reason is JavaThreadsProvider expects Thread object has non-null "holder" field. VirtualThread objects have null "holder" field (virtual threads are always daemon threads, they have fixed priority that cannot be changed, thread status is stored in VirtualThread object).