これらは, JIT コンパイラ用の liveness analysis 機能を実装したクラス (See: here for details).
MethodLiveness は, liveness analysis を実行するクラス.
MethodLivenessResult は, MethodLiveness による解析結果を格納するためのクラス.
BitCounter は, デバッグ用(開発時用)の補助クラス.
(#TODO MethodLiveness と PhaseLive と buildOopMap でやっている liveness analysis はそれぞれどう違う?)
ciMethod クラス内で使用される補助クラス.
liveness analysis 処理中に使用される一時オブジェクト(ResourceObjクラス). 実際の liveness analysis 処理を行う.
((cite: hotspot/src/share/vm/compiler/methodLiveness.hpp))
class MethodLiveness : public ResourceObj {
各 ciMethod オブジェクトの _liveness フィールドに(のみ)格納されている.
以下の箇所で(のみ)生成されている.
以下の箇所で(のみ)使用されている.
((cite: hotspot/src/share/vm/ci/ciMethod.hpp))
// Returns a bitmap indicating which locals are required to be
// maintained as live for deopt. raw_liveness_at_bci is always the
// direct output of the liveness computation while liveness_at_bci
// may mark all locals as live to improve support for debugging Java
// code by maintaining the state of as many locals as possible.
MethodLivenessResult raw_liveness_at_bci(int bci);
MethodLivenessResult liveness_at_bci(int bci);
MethodLiveness はメソッド内の各バイトコード(bci = bytecode index)における「live な local 変数の集合」を調べる.
結果は MethodLivenessResult という bitmap で返される.
処理としては, メソッドを basic block に分割し, 後ろから前に def/use 情報を伝搬させていって fixed point に達するまで繰り返すだけ (ただし, 例外でのコントロールフローも考慮する必要がある).
以上の処理で, 各 basic block 単位の liveness 情報が分かる. 特定の bci での liveness 情報については, 問い合わせがあった際に, その bci を含む basic block の liveness 情報に対して, その basic block 内での def/use 情報を足し込んで算出している模様.
なお, 以下の理由から, 多少不正確な(保守的な)結果となっている.
((cite: hotspot/src/share/vm/compiler/methodLiveness.cpp))
// The MethodLiveness class performs a simple liveness analysis on a method
// in order to decide which locals are live (that is, will be used again) at
// a particular bytecode index (bci).
//
// The algorithm goes:
//
// 1. Break the method into a set of basic blocks. For each basic block we
// also keep track of its set of predecessors through normal control flow
// and predecessors through exceptional control flow.
//
// 2. For each basic block, compute two sets, gen (the set of values used before
// they are defined) and kill (the set of values defined before they are used)
// in the basic block. A basic block "needs" the locals in its gen set to
// perform its computation. A basic block "provides" values for the locals in
// its kill set, allowing a need from a successor to be ignored.
//
// 3. Liveness information (the set of locals which are needed) is pushed backwards through
// the program, from blocks to their predecessors. We compute and store liveness
// information for the normal/exceptional exit paths for each basic block. When
// this process reaches a fixed point, we are done.
//
// 4. When we are asked about the liveness at a particular bci with a basic block, we
// compute gen/kill sets which represent execution from that bci to the exit of
// its blocks. We then compose this range gen/kill information with the normal
// and exceptional exit information for the block to produce liveness information
// at that bci.
//
// The algorithm is approximate in many respects. Notably:
//
// 1. We do not do the analysis necessary to match jsr's with the appropriate ret.
// Instead we make the conservative assumption that any ret can return to any
// jsr return site.
// 2. Instead of computing the effects of exceptions at every instruction, we
// summarize the effects of all exceptional continuations from the block as
// a single set (_exception_exit), losing some information but simplifying the
// analysis.
See: here for details
MethodLiveness クラス内で使用される補助クラス.
基本ブロック(basic block)に関する情報を表す. 1つの MethodLiveness::BasicBlock オブジェクトが 1つの基本ブロックに対応する.
((cite: hotspot/src/share/vm/compiler/methodLiveness.hpp))
// The BasicBlock class is used to represent a basic block in the
// liveness analysis.
class BasicBlock : public ResourceObj {
See: here for details
MethodLiveness による解析結果を格納するためのクラス.
内部的にはビットマップになっている.
((cite: hotspot/src/share/vm/compiler/methodLiveness.hpp))
class MethodLivenessResult : public BitMap {
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
MethodLiveness クラス内で使用される補助クラス. 解析結果に関する統計情報を計算するために使われる (より具体的に言うと, MethodLivenessResult 内のビットを数えるクラス).
なお, このクラスは (デバッグ時であることに加えて) TimeLivenessAnalysis オプションが指定されている場合にしか使用されない.
((cite: hotspot/src/share/vm/compiler/methodLiveness.cpp))
//--------------------------------------------------------------------------
// The BitCounter class is used for counting the number of bits set in
// some BitMap. It is only used when collecting liveness statistics.
#ifndef PRODUCT
class BitCounter: public BitMapClosure {
MethodLiveness::get_liveness_at() 内で(のみ)使用されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.