これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, GC 処理をマルチスレッド化するためのクラス (See: here for details).
特殊な GangWorker クラス (See: here for details).
(通常の GangWorker クラスとの違いは...#TODO)
((cite: hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp))
// Class YieldingFlexibleGangWorker:
// Several instances of this class run in parallel as workers for a gang.
class YieldingFlexibleGangWorker: public GangWorker {
(現状では CMS 専用のクラスである模様)
AbstractWorkGang オブジェクトの _gang_workers フィールドに(のみ)格納されている.
(正確には, このフィールドは GangWorker の配列を格納するフィールド. この中に, 使用される全ての YieldingFlexibleGangWorker オブジェクトが格納されている)
(なお, 実際には AbstractWorkGang は abstract class であり, サブクラスの YieldingFlexibleWorkGang 内の同名のフィールドにのみ格納されている模様)
YieldingFlexibleWorkGang::allocate_worker() というファクトリメソッドが用意されており, その中で(のみ)生成されている. そして, このファクトリメソッドは, 現在は以下のパスで(のみ)呼び出されている.
CMSCollector::CMSCollector() -> WorkGang::initialize_workers() -> YieldingFlexibleWorkGang::allocate_worker()
See: here for details
AbstractGangTask クラスのサブクラスの1つ.
((cite: hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp))
class FlexibleGangTask: public AbstractGangTask {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp))
// The abstract work method.
// The argument tells you which member of the gang you are.
virtual void work(int i) = 0;
AbstractGangTask と比べると, 以下の2つのフィールドが増えている点が異なる (ついでに, このフィールドへのアクセサメソッドも追加されている).
((cite: hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp))
int _actual_size; // size of gang obtained
protected:
int _requested_size; // size of gang requested
See: here for details
FlexibleGangTask クラスのサブクラス (なお, 現在はこのクラスが唯一のサブクラス).
途中で yield() したり abort() したりできる GangTask, らしい (#TODO).
((cite: hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp))
// An abstract task to be worked on by a flexible work gang,
// and where the workers will periodically yield, usually
// in response to some condition that is signalled by means
// that are specific to the task at hand.
// You subclass this to supply your own work() method.
// A second feature of this kind of work gang is that
// it allows for the signalling of certain exceptional
// conditions that may be encountered during the performance
// of the task and that may require the task at hand to be
// `aborted' forthwith. Finally, these gangs are `flexible'
// in that they can operate at partial capacity with some
// gang workers waiting on the bench; in other words, the
// size of the active worker pool can flex (up to an apriori
// maximum) in response to task requests at certain points.
// The last part (the flexible part) has not yet been fully
// fleshed out and is a work in progress.
class YieldingFlexibleGangTask: public FlexibleGangTask {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
特殊な WorkGang クラス
Worker Thread として YieldingGangWorkers クラスを使用しており, 途中で yield する機能を提供する, らしい (#TODO).
((cite: hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp))
// Class YieldingWorkGang: A subclass of WorkGang.
// In particular, a YieldingWorkGang is made up of
// YieldingGangWorkers, and provides infrastructure
// supporting yielding to the "GangOverseer",
// being the thread that orchestrates the WorkGang via run_task().
class YieldingFlexibleWorkGang: public FlexibleWorkGang {
(現状では CMS 専用のクラスである模様)
CMSCollector オブジェクトの _conc_workers フィールドに(のみ)格納されている.
CMSCollector::CMSCollector() 内で(のみ)生成されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.