これらは, VM Operation 処理のためのクラス (See: here and here for details).
VM Operation を実行するためのスレッドクラス (See: here and here for details).
((cite: hotspot/src/share/vm/runtime/vmThread.hpp))
// A single VMThread (the primordial thread) spawns all other threads
// and is itself used by other threads to offload heavy vm operations
// like scavenge, garbage_collect etc.
//
class VMThread: public NamedThread {
VMThread クラスの _vm_thread フィールド (static フィールド) に(のみ)格納されている.
VMThread::create() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている (See: here for details).
(HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> VMThread::create()
See: here for details
VMThread クラス用の補助クラス.
VMThread に対して VM Operation 要求を伝えるための優先順位付きキュー (VMThread に対して何らかの VM Operation を要求する時には, VM_Operation オブジェクトをこのキューに詰めることで通知する).
((cite: hotspot/src/share/vm/runtime/vmThread.hpp))
// Prioritized queue of VM operations.
//
// Encapsulates both queue management and
// and priority policy
//
class VMOperationQueue : public CHeapObj {
VMThread クラスの _vm_queue フィールド (static フィールド) に(のみ)格納されている.
VMThread::create() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている (See: here for details).
(HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> VMThread::create()
登録された VM_Operation オブジェクトは, 優先度毎の doubly linked list で管理している.
各リストは queue というポインタ配列に格納されている. 各リストの長さは _queuelength フィールドに格納されている.
((cite: hotspot/src/share/vm/runtime/vmThread.hpp))
// We maintain a doubled linked list, with explicit count.
int _queue_length[nof_priorities];
int _queue_counter;
VM_Operation* _queue [nof_priorities];
なお, 現状の実装では優先度は3段階 (Safepoint が必要かどうかに応じて分けられている(? #TODO)).
((cite: hotspot/src/share/vm/runtime/vmThread.hpp))
enum Priorities {
SafepointPriority, // Highest priority (operation executed at a safepoint)
MediumPriority, // Medium priority
nof_priorities
};
なお, 実行するのが GC 用の VM_Operation の場合は少し注意が必要になる (実行中(あるいは実行予定)の VM_Operation オブジェクト自体が GC の調査対象になっていないと, GC が終わったときにはポインタが不正になっている恐れがある).
そのため, 処理中(あるいは処理予定)の VM_Operation を入れておくための _drain_list というフィールドが用意されている (この _drain_list フィールドは GC 時のチェック対象になっている. ここに登録しておけば処理途中で GC が起きてもポインタが不正にならないと保証される).
((cite: hotspot/src/share/vm/runtime/vmThread.hpp))
// we also allow the vmThread to register the ops it has drained so we
// can scan them from oops_do
VM_Operation* _drain_list;
See: here for details
VMOperationQueue クラス内で使用される補助クラス.
生成直後の VMOperationQueue オブジェクトには何も VM Operation 要求が入っていないが, VMOperationQueue は要求を circular double-linked list で管理しており, 最低1つは要素がないとリストが作れない. このため, ダミー要素として VM_Dummy オブジェクトが詰められる.
(以上の理由から, VMOperationQueue 内部の _queue リストは, 要素数が 1 の時に空リストを表す. そして 1 未満になることはない)
((cite: hotspot/src/share/vm/runtime/vmThread.cpp))
// Dummy VM operation to act as first element in our circular double-linked list
class VM_Dummy: public VM_Operation {
各 VMOperationQueue クラスの _queue フィールドに(のみ)格納されている.
VMOperationQueue::VMOperationQueue() 内で(のみ)生成されている.
((cite: hotspot/src/share/vm/runtime/vmThread.cpp))
VMOperationQueue::VMOperationQueue() {
// The queue is a circular doubled-linked list, which always contains
// one element (i.e., one element means empty).
for(int i = 0; i < nof_priorities; i++) {
...
_queue[i] = new VM_Dummy();
_queue[i]->set_next(_queue[i]);
_queue[i]->set_prev(_queue[i]);
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.