JVMのアーキテクチャとその仕組みとは?
Every Java Developer Knows by by bytecode is execute by JRE , but JRE is implementation of JVM. “
仮想マシンとは、物理的なマシンをソフトウェアで実装したものです。JavaはWORA (Write Once Run Anywhere) というコンセプトで開発されました。
JVMの仕組み
- クラスローダサブシステム
- ランタイムデータエリア
- 実行エンジン。
さて。 各パーツに飛び込んでみましょう。
1.Class Loader SubSystem :
Javaのダイナミッククラスのロード機能は、クラスローダーサブシステムによって処理されます。 “Load -> Link -> Initialize the class file “を実行時に初めて読み込むことになります。
- Bootstrap Class Loader – bootstrap class path (rt.jar -high priority)からクラスをロードします
- Extension Class Loader – (jre/lib)に含まれるクラスをロードします
- Application Class Loader – アプリケーションレベルのクラスをロードします。
1.2 Linking : ロードされたクラスの検証、準備、解決を行います。
- 検証 : バイトコード検証器は生成されたバイトコードが適切かどうかを検証します。 バイトコード内のすべての静的変数について、メモリが割り当てられ、デフォルト値がロードされます。
- Resolve(オプション)。
1.3 初期化。 クラスローダーの最終段階で、すべての静的変数に元の値が割り当てられます。 & 静的ブロックが実行されます。 Runtime Data Area : (JVM Memory) – 5つのコンポーネントに分かれています
- Method Area : すべてのクラスレベルのデータ(フィールド、メソッド、スタティック変数)が格納されます。
- ヒープ領域 : すべてのオブジェクト & に対応するインスタンス、変数、配列が格納されます。
- ヒープ & メソッド領域は、スレッドセーフではなく、JVMの共有リソースです
3. スタック領域 : 各スレッドに対して、実行時に新しいスタックが作成されます。
- ローカル変数はスタックメモリに格納されます
- スレッドセーフ
- スタックフレームは次の3つのサブエンティティに分割されます。
3.1 ローカル変数配列 : ローカルメソッドに関連する変数が格納されます
3.2 オペランドスタック : 中間演算 – 演算を実行するランタイムワークスペースとして機能します
3.3 フレームデータ : メソッドに対応するすべてのシンボルが格納され、例外が発生した場合にはキャッチブロックの情報が保持されます
4:
4. PCレジスタ:各スレッドには、現在実行中の処理を格納するレジスタがあります(各命令が更新されると、PCレジスタも次の命令を更新します)
5. ネイティブメソッドスタック。
- インタープリタ。
- インタープリタ: バイトコードの解釈は速いですが、実行速度は遅くなります(1つのメソッドが複数回呼ばれると、新しい解釈が必要になります)。
- JIT コンパイラ: インタープリタの欠点を中和します。
バイトコードをネイティブコードにコンパイルします (ネイティブコードは繰り返されるメソッド呼び出しに直接使用されます)。
中間コードジェネレータ : 必要に応じて中間コードを生成します。
Target Code Generator : マシン/ネイティブコードに変換します
Profiler: 複数のメソッドを呼び出している箇所の発見を支援(ホットスポットの発見)
プロファイラ