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.