RFR: 8361103: java_lang_Thread::async_get_stack_trace does not properly protect JavaThread [v4]

David Holmes dholmes at openjdk.org
Thu Jul 17 02:03:49 UTC 2025


On Thu, 17 Jul 2025 01:13:42 GMT, David Holmes <dholmes at openjdk.org> wrote:

>> With `JvmtiVTMSTransitionDisabler` there is normally no need in the carrier thread protection. A virtual thread is either mounted or unmounted. There is no carrier thread when virtual thread is unmounted. If virtual thread is mounted and VTMS transitions are disabled then the carrier thread is blocked until VTMS transitions are enabled again and the execution control is returned to the carrier. But JVMTI is playing by the established rules and always using TLH to protect the JavaThread associated with the virtual thread and its carrier.
>
> If transition disabling is only available with JVMTI then I think we have a significant problem trying to deal with virtual threads in a number of APIs. Without disabling transitions you would basically need a loop that safely extracts the current carrier, handshakes with it, checks the VT is still mounted, and if not repeat the process. At the moment it appears that if the carrier is seen to have changed then we can just skip the VT - which would be very wrong IMO for most APIs e.g. thread dumps.

> please, note that the JvmtiVTMSTransitionDisabler mechanism is enabled only when there is a JVMTI agent.

@sspitsyn  can you clarify this please. When you take a thread dump via the HotsotDiagnosticMXBean is there a JVMTI agent involved? Because that code uses the transition disabler.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/26119#discussion_r2211991487


More information about the hotspot-dev mailing list