Up Top

Memory allocation (& GC 処理) : メモリ関係の初期化処理の流れ (3) : SurrogateLockerThread の生成処理の流れ


概要

Concurrent GC と ReferenceHandler スレッド (= java.lang.ref.Reference オブジェクトを処理するスレッド) が協調して動作できるように, SurrogateLockerThread というスレッドクラスが用意されている. (See: SurrogateLockerThread).

SurrogateLockerThread スレッドは, ConcurrentGCThread による GC が始まる前に java.lang.ref の pending_list_lock を取得して ReferenceHandler の処理と排他する役割を担っている.

備考(Notes)

生成された SurrogateLockerThread に対しては SurrogateLockerThread::manipulatePLL() でメッセージを送ることが出来る.

処理の流れ (概要)(Execution Flows : Summary)

SurrogateLockerThread の生成処理の流れ

(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)

生成された SurrogateLockerThread の処理

_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 への通知処理

SurrogateLockerThread::manipulatePLL()
-> (1) 新しいメッセージをセットする
   
   (2) SurrogateLockerThread を起床させる.
       -> Monitor::notify()
   
   (3) SurrogateLockerThread の処理が終わるまで待機する.
       -> Monitor::wait()

処理の流れ (詳細)(Execution Flows : Details)

ConcurrentMarkSweepThread::makeSurrogateLockerThread()

See: here for details

ConcurrentMarkThread::makeSurrogateLockerThread()

See: here for details

SurrogateLockerThread::make()

See: here for details

SurrogateLockerThread::SurrogateLockerThread()

See: here for details

_sltLoop()

See: here for details

SurrogateLockerThread::loop()

See: here for details

instanceRefKlass::acquire_pending_list_lock()

See: here for details

java_lang_ref_Reference::pending_list_lock()

See: here for details

instanceRefKlass::release_and_notify_pending_list_lock()

See: here for details

SurrogateLockerThread::manipulatePLL()

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.