Javaアーキテクトの基本スキル-JVMメモリモデルの詳細な説明

LubanCollegeのJavaアーキテクトに不可欠なスキル-JVMメモリモデルの詳細な説明

1つ、JVMのどの部分に含まれるか

Javaアーキテクトの基本スキル-JVMメモリモデルの詳細な説明

1.クラスローダー:クラスファイルをメモリにロードします。クラスローダーは、ファイル構造に準拠している限り、ロードのみを考慮してロードされます。実行できるかどうか、つまり実行エンジンについては責任を負いません。

2.実行エンジン(実行エンジン):インタープリターとも呼ばれ、オペレーティングシステムによって実行されるコマンドの解釈を担当します。

3.ネイティブインターフェイス:ネイティブインターフェイスの機能は、javaのさまざまな言語を統合することです。

4.次に、ランタイムデータ領域について詳しく説明します。

二、

Javaアーキテクトの基本スキル-JVMメモリモデルの詳細な説明

上の図はJVMの概念モデルです(単なる概念モデルであり、Java仮想マシンが異なれば実装も異なります)。ほとんどのブログの説明ではこの点が無視されているため、読者の概念が混乱します。

2.1プログラムカウンター

(1)バイトコードインタープリターは、プログラムカウンターの値を変更して、次に実行するバイトコード命令を選択します。分岐、ループ、ジャンプ、例外処理、スレッド回復などの基本機能はすべて、このカウンターに依存して完了します。

(2)各スレッドには独立したプログラムカウンターがあります。

(3)実行がJavaメソッドの場合、このカウンターは実行中のバイトコード命令のアドレスを記録します。ネイティブメソッドの場合、カウンターの値は未定義です。これは、JVM仕様でOutOfMemoryErrorを指定していない唯一の領域でもあります。

2.2Java仮想マシンスタック

(1)Java仮想マシンスタックもスレッドプライベートです。Java仮想マシンスタックは、Javaメソッド実行のメモリモデルを記述します。各メソッドが実行されると、ローカル変数テーブル、オペランドスタック、動的リンク、メソッド出口などの情報を格納するスタックフレームが作成されます。呼び出しから実行の完了までの各メソッドのプロセスは、スタックフレームをプッシュしてスタックをポップするプロセスに対応します。

Javaアーキテクトの基本スキル-JVMメモリモデルの詳細な説明

(2)スタックはよく言われますが、ここでのスタックとは、スタックフレームまたはスタックフレーム内のローカル変数テーブル部分を指します。ローカル変数テーブルには、コンパイル時に認識できるさまざまな基本データタイプ、オブジェクト参照、およびreturnAddressタイプ(バイトコード命令アドレス)が格納されます。ロングとダブルは2つのローカル変数スペース(スロット)を占有し、他のデータタイプは1を占有します。

(3)この領域には2つの異常状態が指定されています。StackOverflow(スレッドによって要求されたスタックの深さが仮想マシンによって許可された深さよりも大きい)およびOutOfMemoryError(十分なメモリに適用できません)。

2.3ローカルメソッドスタック

ネイティブメソッドスタックはJava仮想マシンスタックに似ています。仮想マシンスタックは仮想マシンにJavaメソッド(バイトコード)を実行する役割を果たし、ローカルメソッドスタックはネイティブメソッドに役立ちます。HotSpotは、ローカルメソッドスタックと仮想マシンスタックを1つに結合します。

たとえば、Unsafeクラスのネイティブに変更されたメソッドは、CまたはC ++によって実装され、Javaによって呼び出されます。

Javaアーキテクトの基本スキル-JVMメモリモデルの詳細な説明

2.4ヒープ

(1)オブジェクトインスタンスの大部分はヒープに割り当てられますが、絶対ではありません。

(2)世代別収集アルゴリズムに基づくガベージコレクターを使用する場合(世代別収集アルゴリズムに基づく必要があります!)、Javaヒープは、新世代と旧世代に細分することもできます。その後、エデンエリア、サバイバーエリアから、サバイバーエリアへの世代別コレクションについては、後ほど詳しく説明します。

(3)ヒープを拡張できない場合、OutOfMemoryErrorがスローされます。

2.5メソッドエリア

(1)ジャストインタイムコンパイラによってコンパイルされたクラス情報、定数、静的変数、およびコードを格納するために使用されます。

(2)メソッド領域はHotSpot仮想マシン(Oracle JdkおよびOpenJdkを備えた仮想マシン)に永続生成(個人理解メソッド領域+ GC生成コレクション=永続生成)で実装されます。HotSpotはGC生成コレクションをメソッド領域に拡張します(元々はヒープ内のみ)、HotSpotがJavaヒープのようにメモリのこの部分を管理できるようにします。(BEA Jrockit、IBM J9などの場合、永続的な生成の概念はありません)。JDK7では、オフィシャルは、パーマネント世代に元々存在していた文字列定数プールをパーマネント世代から移動しました(現在、ほとんどのブログは、それがヒープ領域に移動され、検証されていないと考えています)。永続的な生成の概念はJDK8で廃止され、代わりにメタスペースが使用されました。

(3)OutOfMemoryErrorがこの領域にスローされます。

2.6ランタイム定数プール

(1)ランタイム定数プールはメソッド領域の一部です。クラスファイルを格納するための定数プール(コンパイル中に生成されたさまざまなリテラルおよびシンボル参照を格納するために使用される定数プールテーブル)。コンテンツのこの部分は、クラスがロードされた後、メソッド領域の実行時定数プールに格納されます。

javap -verbose xxxx.classコマンドを実行すると、クラスファイル情報を表示できます。次の図は、定数プール情報を示しています。

Javaアーキテクトの基本スキル-JVMメモリモデルの詳細な説明

おすすめ

転載: blog.51cto.com/14993817/2547642