JIT Compiler 用のクラス (より正確に言うと, 脱最適化処理用のクラス).
脱最適化対象となったスタックフレーム内のモニター情報を一時的に待避しておくためのクラス (See: here for details).
1つの MonitorChunk オブジェクトが 1つの (vframe 的な意味での) スタックフレーム中のモニター情報全体に対応する (つまり Java レベルのメソッドと 1対1対応するような論理的なスタックフレーム. インライン展開された場合は実際のスタックフレームとは 1対1対応しない).
以下の箇所に(のみ)格納されている.
その vframeArrayElement オブジェクトが示すスタックフレームに対応する MonitorChunk オブジェクト
(正確には, このフィールドは MonitorChunk の線形リストを格納するフィールド. MonitorChunk オブジェクトは _next フィールドで次の MonitorChunk オブジェクトを指せる構造になっている. 現在脱最適化されている最中のスタックフレームは, 対応する MonitorChunk オブジェクトをこの線形リスト中に持つ)
vframeArrayElement::fill_in() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
* 脱最適化処理 (Deoptimization 処理) Deoptimization::fetch_unroll_info_helper() -> Deoptimization::create_vframeArray() -> vframeArray::allocate() -> vframeArray::fill_in() -> vframeArrayElement::fill_in()
なお, vframeArrayElement::fill_in() 内で JavaThread::_monitor_chunks への登録も行われている.
JavaThread::_monitor_chunks フィールドは以下の箇所で(のみ)参照されている.
JavaThread::is_lock_owned() -> JavaThread::monitor_chunks() JavaThread::oops_do() -> JavaThread::monitor_chunks()
vframeArrayElement::free_monitors() 内で(のみ)削除されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
* 脱最適化処理 (Deoptimization 処理) Deoptimization::unpack_frames() -> vframeArray::unpack_to_stack() -> vframeArray::deallocate_monitor_chunks() -> vframeArrayElement::free_monitors()
なお, vframeArrayElement::free_monitors() 内で JavaThread::_monitor_chunks からの登録解除も行われている.
定義されているフィールドは以下の通り.
(_monitors フィールドは BasicObjectLock の配列を指すポインタ. 配列長は _number_of_monitors フィールドに格納している. また, 配列用の領域はコンストラクタ中で確保している)
((cite: hotspot/src/share/vm/runtime/monitorChunk.hpp))
int _number_of_monitors;
BasicObjectLock* _monitors;
BasicObjectLock* monitors() const { return _monitors; }
MonitorChunk* _next;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.