Concurrent GC と ReferenceHandler スレッド (= java.lang.ref.Reference オブジェクトを処理するスレッド) が協調して動作できるように, SurrogateLockerThread というスレッドクラスが用意されている. (See: SurrogateLockerThread).
SurrogateLockerThread スレッドは, ConcurrentGCThread による GC が始まる前に java.lang.ref の pending_list_lock を取得して ReferenceHandler の処理と排他する役割を担っている.
生成された SurrogateLockerThread に対しては SurrogateLockerThread::manipulatePLL() でメッセージを送ることが出来る.
(HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> ConcurrentMarkSweepThread::makeSurrogateLockerThread() or ConcurrentMarkThread::makeSurrogateLockerThread() -> SurrogateLockerThread::make() -> SurrogateLockerThread::SurrogateLockerThread() -> JavaThread::JavaThread() (← なお, エントリポイントとしては _sltLoop() 関数が指定されている) -> (See: here for details) -> Thread::start() -> (See: here for details)
_sltLoop() -> SurrogateLockerThread::loop() -> 以下の処理を無限ループで行う (1) 新しいメッセージが届くまで待機し続ける. -> Monitor::wait() (2) 届いたメッセージに応じた処理を行う. * acquirePLL の場合: -> instanceRefKlass::acquire_pending_list_lock() * releaseAndNotifyPLL の場合: -> instanceRefKlass::release_and_notify_pending_list_lock() * empty の場合: -> 何もしない (3) メッセージの通知元を起床させる. -> Monitor::notify()
SurrogateLockerThread::manipulatePLL() -> (1) 新しいメッセージをセットする (2) SurrogateLockerThread を起床させる. -> Monitor::notify() (3) SurrogateLockerThread の処理が終わるまで待機する. -> Monitor::wait()
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.