ciEnv クラス内で使用される補助クラス.
ciObject クラス (およびそのサブクラス) 用のファクトリメソッドを実装したクラス(ファクトリクラス). ほとんどの ci* オブジェクトはこのクラスによって生成される.
なお, 一度生成した ciObject オブジェクトはメモイズしてあり, 同じ oop に対しては同一の ci* オブジェクトを返すようになっている.
((cite: hotspot/src/share/vm/ci/ciObjectFactory.hpp))
// ciObjectFactory
//
// This class handles requests for the creation of new instances
// of ciObject and its subclasses. It contains a caching mechanism
// which ensures that for each oop, at most one ciObject is created.
// This invariant allows efficient implementation of ciObject.
class ciObjectFactory : public ResourceObj {
各 ciEnv オブジェクトの _factory フィールドに(のみ)格納されている.
以下の箇所で(のみ)生成されている.
一度生成した ciObject オブジェクトは以下の GrowableArray にメモイズしている (なおコメントによると, ソートして格納しているため取り出す際には二分探索できて高速だが挿入は遅い, とのこと).
((cite: hotspot/src/share/vm/ci/ciObjectFactory.cpp))
// Implementation note: the oop->ciObject mapping is represented as
// a table stored in an array. Even though objects are moved
// by the garbage collector, the compactor preserves their relative
// order; address comparison of oops (in perm space) is safe so long
// as we prohibit GC during our comparisons. We currently use binary
// search to find the oop in the table, and inserting a new oop
// into the table may be costly. If this cost ends up being
// problematic the underlying data structure can be switched to some
// sort of balanced binary tree.
GrowableArray<ciObject*>* ciObjectFactory::_shared_ci_objects = NULL;
ciObjectFactory::create_new_object() が ciObject (とそのサブクラス) 用のファクトリメソッドになっている. このファクトリメソッドは, 現在は以下のパスで(のみ)呼び出されている.
ciEnv::get_object() -> ciObjectFactory::get() -> ciObjectFactory::create_new_object()
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.