对于HotSpot JVM中的JNI关键区域,GCLocker中的慢速路径和快速路径是什么?
这两个概念有什么区别?


我发现来自class GCLocker的代码注释。

  // JNI critical regions are the only participants in this scheme
  // because they are, by spec, well bounded while in a critical region.
  //
  // Each of the following two method is split into a fast path and a
  // slow path. JNICritical_lock is only grabbed in the slow path.
  // _needs_gc is initially false and every java thread will go
  // through the fast path, which simply increments or decrements the
  // current thread's critical count.  When GC happens at a safepoint,
  // GCLocker::is_active() is checked. Since there is no safepoint in
  // the fast path of lock_critical() and unlock_critical(), there is
  // no race condition between the fast path and GC. After _needs_gc
  // is set at a safepoint, every thread will go through the slow path
  // after the safepoint.  Since after a safepoint, each of the
  // following two methods is either entered from the method entry and
  // falls into the slow path, or is resumed from the safepoints in
  // the method, which only exist in the slow path. So when _needs_gc
  // is set, the slow path is always taken, till _needs_gc is cleared.
  static void lock_critical(JavaThread* thread);
  static void unlock_critical(JavaThread* thread);

最佳答案

答案是在您引用的报价中,所以我不确定您还在寻找什么。


_needs_gc == false时,快速路径仅增加/减少计数器-Thread::_jni_active_critical
_needs_gc == true时,慢速路径将通过全局锁定(互斥体)。需要使用互斥锁来确保在最后一个线程离开关键区域后调用一次GC。


似乎您前面已经有了HotSpot源,因此只需看一下gcLocker.inline.hpp中的实现即可:

inline void GC_locker::lock_critical(JavaThread* thread) {
  if (!thread->in_critical()) {
    if (needs_gc()) {
      // jni_lock call calls enter_critical under the lock so that the
      // global lock count and per thread count are in agreement.
      jni_lock(thread);   <-- SLOW PATH
      return;
    }
    increment_debug_jni_lock_count();
  }
  thread->enter_critical();  <-- FAST PATH
}


分成快速/慢速路径的想法是,当不要求GC时,尽可能快地进入/离开JNI关键区域。仅当需要GC时,JNI方法才会承受关键部分的开销。

10-08 07:13