hotspot/src/share/vm/memory/referenceProcessor.cpp
// Enqueue references that are not made active again
void ReferenceProcessor::enqueue_discovered_reflists(HeapWord* pending_list_addr,
AbstractRefProcTaskExecutor* task_executor) {
{- -------------------------------------------
(1) 各リストに対して ReferenceProcessor::enqueue_discovered_reflist() を呼び出し,
それらのリスト中の参照オブジェクトを pending list の先頭に追加する.
なお, ここで以下のリスト全てに対して処理を行っている.
* ReferenceProcessor::_discoveredSoftRefs 内の全てのリスト
* ReferenceProcessor::_discoveredWeakRefs 内の全てのリスト
* ReferenceProcessor::_discoveredFinalRefs 内の全てのリスト
* ReferenceProcessor::_discoveredPhantomRefs 内の全てのリスト
なお, 以下の条件の両方が満たされる場合には, この処理はマルチスレッドを用いて並列に処理する.
* AbstractRefProcTaskExecutor 型の引数(以下の task_executor)が null ではない
(= 有効な AbstractRefProcTaskExecutor オブジェクトが渡されている)
* この ReferenceProcessor オブジェクトの _processing_is_mt フィールドが true
(並列処理する場合には, AbstractRefProcTaskExecutor オブジェクトと RefProcEnqueueTask オブジェクトが用いられる.
See: AbstractRefProcTaskExecutor)
---------------------------------------- -}
if (_processing_is_mt && task_executor != NULL) {
// Parallel code
RefProcEnqueueTask tsk(*this, _discoveredSoftRefs,
pending_list_addr, sentinel_ref(), _max_num_q);
task_executor->execute(tsk);
} else {
// Serial code: call the parent class's implementation
for (int i = 0; i < _max_num_q * subclasses_of_ref; i++) {
enqueue_discovered_reflist(_discoveredSoftRefs[i], pending_list_addr);
_discoveredSoftRefs[i].set_head(sentinel_ref());
_discoveredSoftRefs[i].set_length(0);
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.