Integrated: 8308614: Enabling JVMTI ClassLoad event slows down vthread creation by factor 10
Serguei Spitsyn
sspitsyn at openjdk.org
Fri Dec 1 20:57:52 UTC 2023
On Thu, 16 Nov 2023 11:15:27 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:
> This is a fix of a performance/scalability related issue. The `JvmtiThreadState` objects for virtual thread filtered events enabled globally are created eagerly because it is needed when the `interp_only_mode` is enabled. Otherwise, some events which are generated in `interp_only_mode` from the debugging version of interpreter chunks can be missed.
> However, it has to be okay to avoid eager creation of these object if no `interp_only_mode` has ever been requested.
> It seems to be an extremely important optimization to create JvmtiThreadState objects lazily in such cases.
> It is done by introducing the flag `JvmtiThreadState::_seen_interp_only_mode` which indicates when the `JvmtiThreadState` objects have to be created eagerly.
>
> Additionally, the fix includes the following related changes:
> - Use condition double checking idiom for `MutexLocker mu(JvmtiThreadState_lock)` in the function `JvmtiVTMSTransitionDisabler::VTMS_mount_end` which is on a performance-critical path and looks like this:
>
> JvmtiThreadState* state = thread->jvmti_thread_state();
> if (state != nullptr && state->is_pending_interp_only_mode()) {
> MutexLocker mu(JvmtiThreadState_lock);
> state = thread->jvmti_thread_state();
> if (state != nullptr && state->is_pending_interp_only_mode()) {
> JvmtiEventController::enter_interp_only_mode();
> }
> }
>
>
> - Add extra check of `JvmtiExport::can_support_virtual_threads()` when virtual thread mount and unmount are posted.
> - Minor: Added a `ThreadsListHandle` to the `JvmtiEventControllerPrivate::enter_interp_only_mode`. It is needed because of the dynamic creation of compensating carrier threads which is racy for JVMTI `SetEventNotificationMode` implementation.
>
> Performance mesurements:
> - Without this fix the test provided by the bug submitter gives execution numbers:
> - no ClassLoad events enabled: 3251 ms
> - ClassLoad events are enabled: 40534 ms
>
> - With the fix:
> - no ClassLoad events enabled: 3270 ms
> - ClassLoad events are enabled: 3385 ms
>
> Testing:
> - Ran mach5 tiers 1-6, no regressions are noticed
This pull request has now been integrated.
Changeset: 42af8ce1
Author: Serguei Spitsyn <sspitsyn at openjdk.org>
URL: https://git.openjdk.org/jdk/commit/42af8ce1f6605376fdb69e03df9e22381a54fc36
Stats: 24 lines in 2 files changed: 13 ins; 2 del; 9 mod
8308614: Enabling JVMTI ClassLoad event slows down vthread creation by factor 10
Reviewed-by: dcubed, cjplummer, amenkov
-------------
PR: https://git.openjdk.org/jdk/pull/16686
More information about the hotspot-dev
mailing list