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

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

Commit messages:
 - 8308614: Enabling JVMTI ClassLoad event slows down vthread creation by 
factor 10

Changes: https://git.openjdk.org/jdk/pull/16686/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=16686&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8308614
  Stats: 37 lines in 3 files changed: 24 ins; 4 del; 9 mod
  Patch: https://git.openjdk.org/jdk/pull/16686.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/16686/head:pull/16686

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

Reply via email to