On Thu, 20 Oct 2022 01:21:19 GMT, Chris Plummer <cjplum...@openjdk.org> wrote:

> The debug agent needs to keep track of all loaded classes, and also be 
> notified when they are unloaded. It tracks classes loading by getting 
> CLASS_PREPARE events and it tracks their unloading by tagging them, which 
> triggers OBJECT_FREE events when they are unloaded. The tagging and 
> OBJECT_FREE events are handled by a separate JVMTIEnv from the one that does 
> main event handling, mostly in support of the attached debugger. However, the 
> CLASS_PREPARE events are piggy backed on the main event handler. As a result, 
> we have this special check in filterAndHandleEvent():
> 
>         /* We must keep track of all classes prepared to know what's unloaded 
> */
>         if (evinfo->ei == EI_CLASS_PREPARE) {
>             classTrack_addPreparedClass(env, evinfo->clazz);
>         }
> 
> We also have to always keep CLASS_PREPARE events enabled on the main event 
> handler, even if the debugger is not requesting them. The main event handler 
> has a lot of overhead that isn't necessary when simply wanting to use the 
> CLASS_PREPARE event for class tracking.
> 
> Another downside of this piggy backing is it causes problems for addressing 
> [JDK-8295376](https://bugs.openjdk.org/browse/JDK-8295376), which is 
> attempting to not track virtual threads when the debugger is not attached (no 
> VIRTUAL_THREAD_START and VIRTUAL_THREAD_END events). The problem is when the 
> debugger is not attached and a CLASS_PREPARE event comes in on a virtual 
> thread, the debug agent unnecessarily creates a ThreadNode for it. Since 
> there won't be a corresponding VIRTUAL_THREAD_END event when the virtual 
> thread is destroyed (as long as the debugger is not attached), the debug 
> agent ends up keeping this ThreadNode around even after the thread is gone. 
> This usually eventually leads to an assert.
> 
> The fix for this is pretty simple. We already have the separate JVMTIEnv that 
> the class tracker uses to handle OBJECT_FREE. This is easily purposed to also 
> handle CLASS_PREPARE events. By doing so we can get rid of the special 
> CLASS_PREPARE code above in filterAndHandleEvent(), and we also only need to 
> enable CLASS_PREPARE events for the main event handler when a debugger is 
> attached and is requesting them.

Good simplification.
Thanks,
Serguei

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

Marked as reviewed by sspitsyn (Reviewer).

PR: https://git.openjdk.org/jdk/pull/10776

Reply via email to