Articles

JVMのアーキテクチャとその仕組みとは?

Prabhu Rajendran

Follow

Mar 28, 2019 – 3 min read

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. クラスローダサブシステム
  2. ランタイムデータエリア
  3. 実行エンジン。

さて。 各パーツに飛び込んでみましょう。

1.Class Loader SubSystem :

Javaのダイナミッククラスのロード機能は、クラスローダーサブシステムによって処理されます。 “Load -> Link -> Initialize the class file “を実行時に初めて読み込むことになります。

  1. Bootstrap Class Loader – bootstrap class path (rt.jar -high priority)からクラスをロードします
  2. Extension Class Loader – (jre/lib)に含まれるクラスをロードします
  3. Application Class Loader – アプリケーションレベルのクラスをロードします。

1.2 Linking : ロードされたクラスの検証、準備、解決を行います。

  1. 検証 : バイトコード検証器は生成されたバイトコードが適切かどうかを検証します。 バイトコード内のすべての静的変数について、メモリが割り当てられ、デフォルト値がロードされます。
  2. Resolve(オプション)。

1.3 初期化。 クラスローダーの最終段階で、すべての静的変数に元の値が割り当てられます。 & 静的ブロックが実行されます。 Runtime Data Area : (JVM Memory) – 5つのコンポーネントに分かれています

  1. Method Area : すべてのクラスレベルのデータ(フィールド、メソッド、スタティック変数)が格納されます。
  2. ヒープ領域 : すべてのオブジェクト & に対応するインスタンス、変数、配列が格納されます。
  • ヒープ & メソッド領域は、スレッドセーフではなく、JVMの共有リソースです

3. スタック領域 : 各スレッドに対して、実行時に新しいスタックが作成されます。

  1. ローカル変数はスタックメモリに格納されます
  2. スレッドセーフ
  3. スタックフレームは次の3つのサブエンティティに分割されます。

3.1 ローカル変数配列 : ローカルメソッドに関連する変数が格納されます

3.2 オペランドスタック : 中間演算 – 演算を実行するランタイムワークスペースとして機能します

3.3 フレームデータ : メソッドに対応するすべてのシンボルが格納され、例外が発生した場合にはキャッチブロックの情報が保持されます

4:

4. PCレジスタ:各スレッドには、現在実行中の処理を格納するレジスタがあります(各命令が更新されると、PCレジスタも次の命令を更新します)

5. ネイティブメソッドスタック。

  1. インタープリタ。
  2. インタープリタ: バイトコードの解釈は速いですが、実行速度は遅くなります(1つのメソッドが複数回呼ばれると、新しい解釈が必要になります)。
  3. JIT コンパイラ: インタープリタの欠点を中和します。

バイトコードをネイティブコードにコンパイルします (ネイティブコードは繰り返されるメソッド呼び出しに直接使用されます)。

中間コードジェネレータ : 必要に応じて中間コードを生成します。

Target Code Generator : マシン/ネイティブコードに変換します

Profiler: 複数のメソッドを呼び出している箇所の発見を支援(ホットスポットの発見)

プロファイラ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です