RFR: 8361103: java_lang_Thread::async_get_stack_trace does not properly protect JavaThread [v4]
Serguei Spitsyn
sspitsyn at openjdk.org
Wed Jul 16 07:35:41 UTC 2025
On Wed, 16 Jul 2025 03:33:23 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:
>> I see the current code just produces an empty stack trace if the virtual thread is found to have switched carriers. This seems wrong. We should be "pinning" the virtual thread whilst we try to get its stacktrace, such that it is unmounted or else mounted and fixed to a carrier. Other thread walking code uses the JvmtiVTMSTransitionDisabler to try and achieve this.
>
> Sorry for being late to the party. I still need to walk through all the comments but it seems you have already caught the main problem with virtual threads. Nothing protects them from being concurrently mounted/unmounted/remounted. It is why the `JvmtiVTMSTransitionDisabler` is used in the JVMTI code. But, please, note that the `JvmtiVTMSTransitionDisabler` mechanism is enabled only when there is a JVMTI agent. Otherwise, it has been disabled for scalability purposes to exclude potentially high performance overhead at the VTMS transition points.
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.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26119#discussion_r2209535782
More information about the hotspot-dev
mailing list