On Wed, 28 Jan 2026 20:48:26 GMT, Patricio Chilano Mateo 
<[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.
>
> 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");

FWIW the same "shape" assert is in threadService.cpp

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

PR Review Comment: https://git.openjdk.org/jdk/pull/29461#discussion_r2739949321

Reply via email to