GCLocker 中的慢路径和快路径是什么?
What are the slow and fast path in GCLocker?
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
时,只需 increments/decrements 计数器 - 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
}
拆分为 fast/slow 路径的想法是在不请求 GC 时使 entering/leaving JNI 临界区尽可能快。只有在需要 GC 时,JNI 方法才会承受临界区的开销。
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
时,只需 increments/decrements 计数器 -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
}
拆分为 fast/slow 路径的想法是在不请求 GC 时使 entering/leaving JNI 临界区尽可能快。只有在需要 GC 时,JNI 方法才会承受临界区的开销。