RFR: 8371380: [LOOM] The debug agent should avoid enabling VIRTUAL_THREAD_START/END events when possible

Chris Plummer cjplummer at openjdk.org
Thu Nov 27 01:06:54 UTC 2025


On Tue, 25 Nov 2025 21:56:47 GMT, Alex Menkov <amenkov at openjdk.org> wrote:

>> Don't enabled VIRTUAL_THREAD_START/END events unless absolutely necessary. Solves performance issues when trying to debug apps that create a lot of virtual threads. Details in first comment.
>> 
>> With these changes the Skynet benchmark no longer shows any slowdown when launching with debugging enabled or when attaching the debugger.
>> 
>> Tested with all tier2, tier3, tier5, and tier6 CI testing (with filters to only run svc tests).
>
> src/jdk.jdwp.agent/share/native/libjdwp/eventFilter.c line 1296:
> 
>> 1294: {
>> 1295:     jvmtiError error = JVMTI_ERROR_NONE;
>> 1296:     int ei = NODE_EI(node);
> 
> Suggestion:
> 
>     EventIndex ei = NODE_EI(node);

ok

> src/jdk.jdwp.agent/share/native/libjdwp/eventFilter.c line 1394:
> 
>> 1392:     jvmtiError error2 = JVMTI_ERROR_NONE;
>> 1393:     jthread thread;
>> 1394:     int ei = NODE_EI(node);
> 
> Suggestion:
> 
>     EventIndex ei = NODE_EI(node);

ok

> src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c line 1691:
> 
>> 1689:      * a deferred event request.
>> 1690:      */
>> 1691:     if (gdata->virtualThreadStartEventsPermanentlyEnabled) {
> 
> Looks like this block can disable VITRUAL_THREAD_START when `rememberVThreadsWhenDisconnected` is set.

virtualThreadStartEventsPermanentlyEnabled is only set true if includeVThreads is false, which means rememberVThreadsWhenDisconnected is also false (they are always set the same, as I discuss in my new comment below).

virtualThreadStartEventsPermanentlyEnabled could use a better name because it means "permanently enabled for handling deferred event enabling", whereas if includeVThreads is true, VITRUAL_THREAD_START events are always permanently enabled, but virtualThreadStartEventsPermanentlyEnabled will never be set true.

> src/jdk.jdwp.agent/share/native/libjdwp/util.h line 90:
> 
>> 88:     jboolean includeVThreads;   /* If true, VM.AllThreads includes vthreads. */
>> 89:     jboolean rememberVThreadsWhenDisconnected;
>> 90:     jboolean virtualThreadStartEventsPermanentlyEnabled;
> 
> Could you please add description for this 2 flags (and maybe `vthreadsSupported` description also can be enhanced to see relations between the flags)

I'm going to get rid of rememberVThreadsWhenDisconnected and just replace references to it with includeVThreads. Right now they are always set the same. I was considering someday making it a flag that could be set on the command line, but I don't seen a need for that anymore. I'd like to get rid of includeVThreads too, but some tests still rely on it. I'll files a CR for all this work soon.

I also plan on getting rid of vthreadsSupported. I doubt setting it to false even works. It's just a remnant from the early days of development of vthread support. It should just always be assumed true now. I'll file a CR for this also.

I'll add some comments for virtualThreadStartEventsPermanentlyEnabled.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/28485#discussion_r2566838053
PR Review Comment: https://git.openjdk.org/jdk/pull/28485#discussion_r2566838574
PR Review Comment: https://git.openjdk.org/jdk/pull/28485#discussion_r2566837301
PR Review Comment: https://git.openjdk.org/jdk/pull/28485#discussion_r2566825506


More information about the serviceability-dev mailing list