On Wed, 28 Jan 2026 09:35:00 GMT, Alan Bateman <[email protected]> wrote:

> JDK-8364343 upgraded the virtual thread transition management to be 
> independent of JVMTI. We can update java_lang_Thread::async_get_stack_trace 
> to use it and remove the suspend + retry code from Thread.getStackTrace.
> 
> A summary of the changes:
> 
> - java_lang_Thread::async_get_stack_trace is changed to use the new handshake 
> op so it can be called to get the stack trace of a started thread in any state
> - Thread::getStackTrace is changed to use async_get_stack_trace for all cases
> - The SUSPENDED substate in VirtualThread is removed
> - JVM_CreateThreadSnapshot is changed to be usable when JVMTI is not compiled 
> in
> - ThreadSnapshotFactory::get_thread_snapshot is changed to not upcall to 
> StackTraceElement to complete the init of the stack trace
> 
> The changes mean that Thread::getStackTrace may be slower when sampling a 
> virtual thread in transition. This case should be rare, and it isn't really a 
> performance critical op anyway. I prototyped use a spin loop and an 
> increasing wait time in MountUnmountDisabler::disable_transition_for_one to 
> avoid the wait(10) but decided to leave it out for now. Future work may 
> examine this issue as there may be other cases (with JVMTI) that would 
> benefit from avoiding the wait.
> 
> A future PR might propose to change Thread.getStackTrace to use 
> ThreadSnapshot and allow java_lang_Thread::async_get_stack_trace be removed. 
> This requires more extensive changes to ThreadSnapshotFactory to reduce 
> overhead when only the stack trace is required.
> 
> Testing: tier1-5.  The changes has been already been tested in the loom repo 
> for a few months.

Nice cleanup, looks good to me.

src/hotspot/share/classfile/javaClasses.cpp line 1914:

> 1912: 
> 1913:   bool has_java_thread = tlh.cv_internal_thread_to_JavaThread(jthread, 
> &java_thread, &thread_oop);
> 1914:   assert((has_java_thread && thread_oop != nullptr) || 
> !has_java_thread, "Missing Thread oop");

Suggestion:

  assert(!has_java_thread || thread_oop != nullptr, "Missing Thread oop");

src/hotspot/share/classfile/javaClasses.cpp line 1944:

> 1942: 
> 1943:       bool is_virtual = 
> java_lang_VirtualThread::is_instance(_thread_h());
> 1944:       bool vthread_carrier = !is_virtual && (java_thread != nullptr) && 
> (java_thread->vthread_continuation() != nullptr);

The extra `java_thread != nullptr` should not be necessary.

-------------

PR Review: https://git.openjdk.org/jdk/pull/29461#pullrequestreview-3719083411
PR Review Comment: https://git.openjdk.org/jdk/pull/29461#discussion_r2738545829
PR Review Comment: https://git.openjdk.org/jdk/pull/29461#discussion_r2738566963

Reply via email to