これらは, HotSpot 内でのスレッド管理用のクラス. より具体的に言うと, スレッドのスタックフレームを扱うためのユーティリティ・クラス.
スタックフレーム(activation record)を扱うためのユーティリティ・クラス. 1つの frame オブジェクトが 1つのスタックフレームに対応する.
なお, HotSpot 内で使用されるスタックフレームには幾つかの種別があるが, このクラスはどの種別のスタックフレームでも扱える (例: C のフレーム, Java の (JIT コンパイルされたメソッドの) フレーム, Java の (Interpreter 実行されているメソッドの) フレーム).
なお, JIT コンパイラによってインライン展開が行われていた場合, スタックフレームは Java レベルのメソッドと1対1対応しないことがある (実際のスタックフレーム 1 に対して Java レベルのメソッド n 個が対応). Java レベルのメソッドと 1対1対応するような(論理的な)スタックフレームの情報が欲しい場合は, このクラスの代わりに vframe クラスを使用すればいい.
((cite: hotspot/src/share/vm/runtime/frame.hpp))
// A frame represents a physical stack frame (an activation). Frames
// can be C or Java frames, and the Java frames can be interpreted or
// compiled. In contrast, vframes represent source-level activations,
// so that one physical frame can correspond to multiple source level
// frames because of inlining.
class frame VALUE_OBJ_CLASS_SPEC {
以下の箇所に(のみ)格納されている.
(ただし, ResourceObjクラスのフィールドなので一時的なオブジェクト)
(ただし, vframeArrayElement オブジェクトのフィールドなので一時的なオブジェクト)
(ただし, vframeArray オブジェクトのフィールドなので一時的なオブジェクト)
(ただし, vframeArray オブジェクトのフィールドなので一時的なオブジェクト)
(ただし, vframeArray オブジェクトのフィールドなので一時的なオブジェクト)
(ただし, ResourceObjクラスのフィールドなので一時的なオブジェクト)
(ただし, StackObjクラスのフィールドなので一時的なオブジェクト)
以下の箇所で(のみ)生成されている (ValueObj クラスなので「生成」というのは少し違和感があるが, 以下の箇所でのみ新しい値を持ったインスタンスが生成されている. 他の使用箇所はコピーコンストラクタ, あるいは既に生成済みの値へのポインタ).
(上記のフィールドは全て, ポインタ型ではなく実体なので, 格納しているオブジェクトの生成時に一緒に生成される)
os::fetch_frame_from_context(void* ucVoid)
os::get_sender_for_C_frame()
os::current_frame()
JavaThread::pd_get_top_frame_for_signal_handler()
JavaThread::pd_last_frame()
frame::sender()
frame::java_sender()
frame::profile_find_Java_sender_frame()
MethodHandles::ricochet_frame_sender()
See: here for details
デバッグ用(開発時用)のクラス (#ifndef ENABLE_ZAP_DEAD_LOCALS 時にしか定義されない).
スタックフレーム中の oop 以外の格納場所について, 誤って oop が格納されていないかどうかをチェックする Closure クラス
(より正確に言うと,「oop の可能性が考えられる値(ヒープ内を指しているポインタと考えられる値)」が格納されていれば warning を出力する Closure クラス)
((cite: hotspot/src/share/vm/runtime/frame.hpp))
# ifdef ENABLE_ZAP_DEAD_LOCALS
((cite: hotspot/src/share/vm/runtime/frame.hpp))
class CheckValueClosure: public OopClosure {
frame クラスの _check_value フィールド (static フィールド) に(のみ)格納されている.
以下の箇所で(のみ)使用されている.
現状では, ENABLE_ZAP_DEAD_LOCALS は #ifdef ASSERT 時かつ #ifdef COMPILER2 時にしか定義されない.
((cite: hotspot/src/share/vm/utilities/globalDefinitions.hpp))
// Enable zap-a-lot if in debug version.
# ifdef ASSERT
# ifdef COMPILER2
# define ENABLE_ZAP_DEAD_LOCALS
#endif /* COMPILER2 */
# endif /* ASSERT */
See: here for details
デバッグ用(開発時用)のクラス (#ifndef ENABLE_ZAP_DEAD_LOCALS 時にしか定義されない).
スタックフレーム中の oop の格納場所について, 誤って oop ではない値が格納されていないかどうかをチェックする Closure クラス
((cite: hotspot/src/share/vm/runtime/frame.hpp))
# ifdef ENABLE_ZAP_DEAD_LOCALS
((cite: hotspot/src/share/vm/runtime/frame.hpp))
class CheckOopClosure: public OopClosure {
frame クラスの _check_oop フィールド (static フィールド) に(のみ)格納されている.
以下の箇所で(のみ)使用されている.
現状では, ENABLE_ZAP_DEAD_LOCALS は #ifdef ASSERT 時かつ #ifdef COMPILER2 時にしか定義されない.
((cite: hotspot/src/share/vm/utilities/globalDefinitions.hpp))
// Enable zap-a-lot if in debug version.
# ifdef ASSERT
# ifdef COMPILER2
# define ENABLE_ZAP_DEAD_LOCALS
#endif /* COMPILER2 */
# endif /* ASSERT */
See: here for details
デバッグ用(開発時用)のクラス (#ifndef ENABLE_ZAP_DEAD_LOCALS 時にしか定義されない).
スタックフレーム中の dead になっている箇所(= 今後使用されない箇所)について, zap 処理 (= 明示的に壊れた値を書き込むことで間違って使用した場合の検出を容易にする処理) を行う.
((cite: hotspot/src/share/vm/runtime/frame.hpp))
# ifdef ENABLE_ZAP_DEAD_LOCALS
((cite: hotspot/src/share/vm/runtime/frame.hpp))
class ZapDeadClosure: public OopClosure {
frame クラスの _zap_dead フィールド (static フィールド) に(のみ)格納されている.
frame::zap_dead_interpreted_locals() 内で(のみ)使用されている.
現在は, 0xbabebabe という値を書き込んでいる.
See: here for details
現状では, ENABLE_ZAP_DEAD_LOCALS は #ifdef ASSERT 時かつ #ifdef COMPILER2 時にしか定義されない.
((cite: hotspot/src/share/vm/utilities/globalDefinitions.hpp))
// Enable zap-a-lot if in debug version.
# ifdef ASSERT
# ifdef COMPILER2
# define ENABLE_ZAP_DEAD_LOCALS
#endif /* COMPILER2 */
# endif /* ASSERT */
See: here for details
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない).
スタックフレーム内のレイアウトについて, レイアウトが正しいかどうかの確認, またはレイアウト情報の出力を行う.
((cite: hotspot/src/share/vm/runtime/frame.hpp))
#ifdef ASSERT
((cite: hotspot/src/share/vm/runtime/frame.hpp))
// A collection of described stack values that can print a symbolic
// description of the stack memory. Interpreter frame values can be
// in the caller frames so all the values are collected first and then
// sorted before being printed.
class FrameValues {
JavaThread::print_frame_layout() 内で(のみ)使用されている.
See: here for details
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない).
FrameValues クラス内で使用される補助クラス.
スタックフレーム内の各値のレイアウト情報を表す. 1つの FrameValue オブジェクトが 1つの値に対応する.
((cite: hotspot/src/share/vm/runtime/frame.hpp))
#ifdef ASSERT
((cite: hotspot/src/share/vm/runtime/frame.hpp))
// A simple class to describe a location on the stack
class FrameValue VALUE_OBJ_CLASS_SPEC {
各 FrameValues オブジェクトの _values フィールドに(のみ)格納されている.
(正確には, このフィールドは FrameValue の GrowableArray を格納するフィールド. この中に, その FrameValues 用の全ての FrameValue オブジェクトが格納されている)
GrowableArray 用のメモリ領域は FrameValues オブジェクトの生成時に一緒に生成される.
そのメモリ領域中に個別の FrameValue オブジェクトを書き込む作業は FrameValues::describe() 内で(のみ)行われている.
単なる構造体のようなクラス. 内部には以下の 4つの public フィールドのみを持つ (そしてメソッドはない).
((cite: hotspot/src/share/vm/runtime/frame.hpp))
intptr_t* location;
char* description;
int owner;
int priority;
See: here for details
指定したスレッドのスタックフレームをたどるためのイテレータクラス(StackObjクラス).
((cite: hotspot/src/share/vm/runtime/frame.hpp))
// StackFrameStream iterates through the frames of a thread starting from
// top most frame. It automatically takes care of updating the location of
// all (callee-saved) registers. Notice: If a thread is stopped at
// a safepoint, all registers are saved, not only the callee-saved ones.
//
// Use:
//
// for(StackFrameStream fst(thread); !fst.is_done(); fst.next()) {
// ...
// }
//
class StackFrameStream : public StackObj {
以下の箇所で(のみ)使用されている.
JavaThread の処理
脱最適化処理 (Deoptimization 処理)
VMError による処理 (print_stack_trace)
デバッグ用(開発時用)の処理
See: here for details
OffsetClosure クラスの具象サブクラスの1つ.
他の OopClosure と組み合わせて使用される Closure クラス. Interpreter フレーム内(局所変数領域内/オペランドスタック内)に現在存在する全ての oop に対して, 指定された OopClosure を適用する.
((cite: hotspot/src/share/vm/runtime/frame.cpp))
/*
The interpreter_frame_expression_stack_at method in the case of SPARC needs the
max_stack value of the method in order to compute the expression stack address.
It uses the methodOop in order to get the max_stack value but during GC this
methodOop value saved on the frame is changed by reverse_and_push and hence cannot
be used. So we save the max_stack value in the FrameClosure object and pass it
down to the interpreter_frame_expression_stack_at method
*/
class InterpreterFrameClosure : public OffsetClosure {
以下の箇所で(のみ)使用されている.
See: here for details
スタックフレームに対する oops_do 処理 (= frame::oops_do()) 用の補助クラス(SignatureInfoクラス). なお, このクラスは他の OopClosure と組み合わせて使用される.
Safepoint 処理で停止した地点がメソッドの呼び出し点(invoke* バイトコード等)であれば, 引数中に含まれる全ての oop についても処理を行う必要がある. このクラスは, 引数中の全ての oop に対して, 指定された OopClosure を適用する.
(なお, フレームの種別に応じて, 同様の役割を持つクラスが幾つか存在する. このクラスは Interpreter のフレーム用 (See: EntryFrameOopFinder, CompiledArgumentOopFinder))
((cite: hotspot/src/share/vm/runtime/frame.cpp))
class InterpretedArgumentOopFinder: public SignatureInfo {
frame::oops_interpreted_arguments_do() 内で(のみ)使用されている.
See: here for details
スタックフレームに対する oops_do 処理 (= frame::oops_do()) 用の補助クラス(SignatureInfoクラス). なお, このクラスは他の OopClosure と組み合わせて使用される.
Safepoint 処理で停止した地点がメソッドの呼び出し点(invoke* バイトコード等)であれば, 引数中に含まれる全ての oop についても処理を行う必要がある. このクラスは, 引数中の全ての oop に対して, 指定された OopClosure を適用する.
(なお, フレームの種別に応じて, 同様の役割を持つクラスが幾つか存在する. このクラスは entry frame (JavaCalls 経由で Java コードを呼んだときに積まれるダミーのフレーム) 用 (See: InterpretedArgumentOopFinder, CompiledArgumentOopFinder))
((cite: hotspot/src/share/vm/runtime/frame.cpp))
// Entry frame has following form (n arguments)
// +-----------+
// sp -> | last arg |
// +-----------+
// : ::: :
// +-----------+
// (sp+n)->| first arg|
// +-----------+
((cite: hotspot/src/share/vm/runtime/frame.cpp))
// visits and GC's all the arguments in entry frame
class EntryFrameOopFinder: public SignatureInfo {
frame::oops_entry_do() 内で(のみ)使用されている.
See: here for details
スタックフレームに対する oops_do 処理 (= frame::oops_do()) 用の補助クラス(SignatureInfoクラス). なお, このクラスは他の OopClosure と組み合わせて使用される.
Safepoint 処理で停止した地点がメソッドの呼び出し点(invoke* バイトコード等)であれば, 引数中に含まれる全ての oop についても処理を行う必要がある. このクラスは, 引数中の全ての oop に対して, 指定された OopClosure を適用する.
(なお, フレームの種別に応じて, 同様の役割を持つクラスが幾つか存在する. このクラスは JIT 生成コードのフレーム用 (See: InterpretedArgumentOopFinder, EntryFrameOopFinder))
((cite: hotspot/src/share/vm/runtime/frame.cpp))
class CompiledArgumentOopFinder: public SignatureInfo {
frame::oops_compiled_arguments_do() 内で(のみ)使用されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.