Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[HeapViewer] failed to show threads when heap dump contains virtual threads (JDK 22) #539

Closed
alexmenkov opened this issue Dec 7, 2023 · 8 comments
Assignees

Comments

@alexmenkov
Copy link

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:

  • open the heap dump;
  • switch to "Threads";
    error:
    java.lang.NullPointerException
    at org.graalvm.visualvm.heapviewer.java.impl.JavaThreadsProvider.getThreadName(JavaThreadsProvider.java:89)

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).

@alexmenkov alexmenkov added the bug label Dec 7, 2023
@thurka thurka self-assigned this Dec 8, 2023
@thurka thurka removed the bug label Dec 8, 2023
@thurka
Copy link
Member

thurka commented Dec 8, 2023

I am not able to reproduce it. Where is 'heap dump contains virtual threads'?

@alexmenkov
Copy link
Author

Myheapdump_vt.zip

@alexmenkov
Copy link
Author

I've attached sample hprof file which contains virtual threads

@thurka
Copy link
Member

thurka commented Dec 9, 2023

Thanks, I will take a look.

@thurka
Copy link
Member

thurka commented Dec 12, 2023

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

@alexmenkov
Copy link
Author

@thurka The thread dump looks good.
Duplicate of the Virtual thread [#29] is bug in the JDK heap dumper. Will fix it.

@thurka
Copy link
Member

thurka commented Dec 13, 2023

Will fix it.

Great.
I want to separate normal and virual threads in threads view (or create separate virtual threads view).

@thurka
Copy link
Member

thurka commented Dec 18, 2023

NPE fixed in master.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants