主にホットスポット JVM について
1.JVMとは
JVM は、一連のバイトコード命令、一連のレジスタ、スタック、ヒープ、ガベージ コレクター、およびストレージ メソッド フィールドを含むJava コード用の仮想コンピューターです。
1. Java ソース ファイルは、javac 言語コンパイラによって .class バイトコード ファイルにコンパイルされます。
2. JVM のインタプリタは、特定のマシン上でマシンコードにコンパイルされます。
Java インタープリタはマシンごとに異なるため、Java はクロスプラットフォームで使用できます
コンパイルおよびインタープリタ言語
面白い例を見てください、食べたいように
1. 編纂語は、食事を直接作り、直接食べることです。そして食べたいときにいつでもそこにあります
2. 通訳言語は、おいしい鍋を作ることです。食べたい場合は、彼が少しずつ調理するのを待って、少しずつ食べる必要があります
つまり、コンパイル言語とインタプリタ言語が存在します
Java プログラムの実行が開始されると、JVM 仮想マシンのインスタンス化が開始され、複数のプログラムが複数の仮想マシンを持つことになります。データは複数の仮想マシン インスタンス間で共有されません。
2. JVMのメモリモデル
スレッドプライベート領域: スレッドによって生きたり消えたりし、各スレッドはオペレーティング システムのネイティブ スレッドに直接マッピングされます。
スレッド共有領域:仮想マシンで起動/破棄
ダイレクト メモリ: JVM によって管理されませんが、Java は引き続きこれを呼び出します。たとえば、I/O の多くのメソッドは、関数を通じてこの領域を呼び出します。
2.1 プログラムカウンター
小さなメモリ空間は、現在のスレッドによって実行されるバイトコードの行番号インジケーターであり、各スレッドには独自のプログラム カウンタがあります。
2.2 仮想マシンスタック
Javaがメソッドを実行する領域です。各メソッドは、実行前にスタック フレームを作成します。スタック フレームには、このメソッドの変数、オペランド スタック、ダイナミック リンク、メソッド出口、およびその他の情報が保存されます。メソッドの呼び出しから実行完了までは、仮想マシンスタック上のスタックフレームがプッシュからポップされるまでの過程に相当します。
スタック フレームは、メソッドが呼び出されるときに作成され、メソッドがデータと部分的な処理結果の保存を終了するときに破棄されます。また、動的リンク、メソッドの戻り値、および例外のディスパッチを処理するためにも使用されます。
2.3 ローカルメソッド領域
ローカル メソッド領域は Java スタックに似ていますが、仮想マシン スタックが Java スレッドを提供し、ローカル メソッド スタックがネイティブ メソッドを提供する点が異なります。HotSpot VM は、ネイティブ メソッド スタックと仮想マシン スタックを 1 つに結合します。
2.4 ヒープ
ヒープとはJavaの実行時データ領域であり、スレッドによって共有される領域です。作成されたオブジェクトと配列は Java ヒープ メモリに保存されます。これはガベージ コレクションにとって最も重要なメモリ領域でもあります。世代別コレクション アルゴリズムにより、ヒープは若い世代と古い世代に分割されます。
2.5 メソッド領域/永続生成/メタスペース
これは私たちがよく永続世代と呼ぶもので、JVM によってロードされたクラス情報、定数、静的変数、コンパイラーによってコンパイルされたコード、メタ、およびその他のデータを保存するために使用されます。HotSpot は GC 世代別コレクションをメソッド領域まで拡張します。つまり、Java ヒープの永続世代を使用してメソッド領域を実装するため、このメモリも GC を通じて管理できます。主に定数プールとタイプのアンロードをリサイクルします
Java8では、永続世代が削除され、「メタデータ領域」(メタスペース) と呼ばれる領域に置き換えられました。メタスペース
メタスペースの本質は永続世代の本質と似ていますが、メタスペースと永続世代の最大の違いは、 メタスペースが仮想マシン内になく、ローカル メモリを使用することです 。したがって、デフォルトでは、メタスペースのサイズはローカル メモリによってのみ制限されます。クラスのメタデータはネイティブ メモリに配置され、文字列プールとクラスの静的変数は Java ヒープに配置されるため、ロードできるクラス メタデータの量は MaxPermSize によって制御されなくなり、システムの実際の利用可能な領域によって制御されます。
実行時定数プールもメソッド領域の一部であり、クラスでのコンパイル中に生成されたさまざまなリテラルとシンボル参照が格納されます。
3. まとめ
- JVM は、主に Java バイトコード ファイルを実行するために使用される架空のコンピュータです。
- JVM には、クラス ローダー、実行エンジン、ランタイム データ領域、ローカル メソッド インターフェイスなどが含まれます。
- JVM メモリは主にスレッド プライベート メモリ、スレッド共有メモリ、ダイレクト メモリに分かれています。プライベートはプログラム カウンター、仮想マシン スタック、ローカル メソッド スタックに分割され、共有はメソッド領域とヒープに分割されます。