ホームページ  >  記事  >  Java  >  JVM の概要

JVM の概要

一个新手
一个新手オリジナル
2017-10-10 09:17:511866ブラウズ

JVM の概要

1. JVM とは何ですか?

JVMとはJava Virtual Machineの略称で、実際のコンピュータ上で様々なコンピュータの機能を模擬して実現される仮想のコンピュータです。 Java 仮想マシンには、バイトコード命令のセット、レジスターのセット、スタック、ガベージ コレクション ヒープ、およびストレージ メソッド フィールドが含まれます。 JVM は特定のオペレーティング システム プラットフォームに関連する情報をシールドするため、Java プログラムは Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけでよく、変更することなくさまざまなプラットフォーム上で実行できます。 JVM がバイトコードを実行するとき、実際には最終的にバイトコードを特定のプラットフォームで実行するためのマシン命令に解釈します。

Java 言語の非常に重要な特徴は、プラットフォームから独立していることです。この機能を実現するには、Java 仮想マシンの使用が鍵となります。一般的な高級言語を異なるプラットフォームで実行したい場合は、少なくとも異なるターゲット コードにコンパイルする必要があります。 Java 言語仮想マシンの導入後は、別のプラットフォームで実行するときに Java 言語を再コンパイルする必要はありません。 Java 言語は、Java 仮想マシンを使用して特定のプラットフォームに関連する情報をシールドします。そのため、Java 言語コンパイラは、Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけでよく、変更することなく複数のプラットフォーム上で実行できます。 。 Java 仮想マシンはバイトコードを実行するときに、そのバイトコードを特定のプラットフォームで実行するためのマシン命令に解釈します。これが、Java が「一度コンパイルすれば、どこでも実行できる」理由です。

2. JRE/JDK/JVMの関係は何ですか?

JRE (JavaRuntimeEnvironment、Java 実行環境)、Java プラットフォームです。すべての Java プログラムは JRE で実行する必要があります。一般ユーザーは開発したJavaプログラムを実行し、JREをインストールするだけで済みます。

JDK (Java Development Kit) は、プログラム開発者が Java プログラムをコンパイルおよびデバッグするために使用する開発ツール キットです。 JDK ツールも Java プログラムであり、JRE を実行する必要があります。 JDK の独立性と整合性を維持するために、JDK のインストール プロセス中に JRE もインストールの一部として組み込まれます。したがって、JDK インストール ディレクトリの下に jre という名前のディレクトリがあり、JRE ファイルの保存に使用されます。

JVM (JavaVirtualMachine、Java 仮想マシン) は JRE の一部です。コンピュータのさまざまな機能を実際のコンピュータ上で模擬して実現した架空のコンピュータです。 JVM には、プロセッサ、スタック、レジスタなどの独自の完全なハードウェア アーキテクチャがあり、対応する命令システムもあります。 Java 言語の最も重要な機能は、クロスプラットフォーム操作です。 JVM を使用する目的は、オペレーティング システムの独立性をサポートし、クロスプラットフォームを実現することです。

3. JVM の原則

JVM は Java のコアであり基盤であり、Java コンパイラーと OS プラットフォームの間の仮想プロセッサーです。これは、基礎となるオペレーティング システムとソフトウェア メソッドを使用して実装されたハードウェア プラットフォームに基づく抽象的なコンピュータであり、その上で Java バイトコード プログラムを実行できます。

Java コンパイラーは、JVM に合わせて、JVM が理解できるコードまたはバイトコード ファイルを生成することのみが必要です。 Java ソース ファイルはバイトコード プログラムにコンパイルされ、各命令は JVM を通じてさまざまなプラットフォーム用のマシンコードに変換され、特定のプラットフォームで実行されます。

4. JVM がプログラムを実行するプロセス

1) .class ファイルをロードする 2) メモリを管理し、割り当てる 3) ガベージコレクションを実行する

JRE (Java 実行環境) 構築された Java プログラムの実行ループJVM によって、これは Java プログラムが実行される環境でもありますが、アプリケーションであると同時にオペレーティング システムのプロセスでもあるため、独自のコードとデータだけでなく、独自の実行ライフ サイクルもあります。空間。 JVM は jdk 全体の最下部にあり、オペレーティング システムの相互作用を担当し、オペレーティング システム環境を保護し、完全な Java 実行環境を提供するために使用されるため、仮想コンピュータでもあります。オペレーティング システムの JVM のロードは、jdk の Java.exe によって完了します。JVM 環境は、次の 4 つの手順で完成します。 1) JVM ロード環境の作成と構成 2) JVM.dll のロード 3) JVM.dll の初期化と JNIENV へのマウント( JNI 呼び出しインターフェース) インスタンス 4) JNIEnv インスタンスを呼び出して、クラス class をロードして処理します。

5. JVM ライフサイクル

1) JVM インスタンスは、プロセス レベルで開始される独立して実行される Java プログラムに対応します
a)。 Java プログラムが開始されると、JVM インスタンスが生成されます。 public static void
main(String[] args) 関数を持つクラスは、JVM インスタンスを実行するための開始点として使用できます
b)。 main() はプログラムの初期スレッドの開始点として機能し、他のスレッドはすべてこのスレッドによって開始されます。 JVM 内には、デーモン スレッドと非デーモン スレッドの 2 種類のスレッドがあります。main() は、通常、JVM 自体によって使用されるスレッドであることを示します。作成されたのはデーモン スレッド
c) であり、終了します。プログラム内のすべての非デーモン スレッドが終了すると、JVM は終了します。セキュリティ マネージャーが許可する場合、プログラムは Runtime クラスまたは System.exit() を使用して終了することもできます

2) JVM 実行エンジンのインスタンスは、ユーザーが実行しているプログラムに属するスレッド (スレッドレベル) に対応します

6. JVM アーキテクチャ

  • ClassLoader (.class ファイルのロードに使用)

  • 実行エンジン (バイトコードの実行、またはローカルメソッドの実行)

  • ランタイムデータ領域(メソッド領域、ヒープ、Javaスタック、PCレジスタ、ローカルメソッドスタック)

7. JVMランタイムデータ領域

最初のブロック: PC レジスタ

PC レジスタは、各スレッドが次に実行する JVM 命令を格納するために使用されます。メソッドがネイティブの場合、PC レジスタには情報が格納されません。

2 番目のブロック: JVM スタック

JVM スタックはスレッドに対してプライベートです。各スレッドが作成されると、JVM スタックは現在のスレッドにローカルの基本型変数 (Java で定義された 8 つ) を保存します。基本型: boolean、char、byte、short、int、long、float、double)、部分的な戻り結果、および非基本型のオブジェクトは、JVM スタック上のヒープを指すアドレスのみを格納します。

3 番目のブロック: ヒープ

これは、JVM がオブジェクトのインスタンスと配列の値を保存するために使用する領域です。Java の new によって作成されたすべてのオブジェクトのメモリがここに割り当てられ、オブジェクトはここに割り当てられると考えられます。ヒープ メモリは GC が再利用されるまで待つ必要があります。

(1) ヒープは JVM 内のすべてのスレッドによって共有されるため、ヒープにオブジェクト メモリを割り当てるにはロックが必要となり、新しいオブジェクトに対して比較的大きなオーバーヘッドが発生します

(2) Sunオブジェクトのメモリ割り当てを効率化するために、ホットスポット JVM は作成されたスレッドに独立したスペース TLAB (スレッド ローカル アロケーション バッファ) を割り当てます。そのサイズは、TLAB 上にオブジェクトを割り当てるときに、JVM によって計算されます。この場合、JVM でのオブジェクト メモリ割り当てのパフォーマンスは基本的に C と同じくらい効率的ですが、オブジェクトが大きすぎる場合は、JVM が TLAB 上でメモリを割り当てようとします。 (3) TLAB は新しい世代の Eden Space に対してのみ機能するため、Java プログラムを作成するときは、通常、大きなオブジェクトよりも複数の小さなオブジェクトを割り当てる方が効率的です。

(4) 新しく作成されたすべてのオブジェクトは、新しい世代の Yong Generation に保存されます。 Young Generation のデータが 1 回以上の GC を乗り越えた場合、Old Generation に転送されます。新しいオブジェクトは常にエデン スペースで作成されます。

4 番目のブロック: メソッド領域

(1) Sun JDK では、この領域は PermanetGeneration (永続世代とも呼ばれます) に対応します。

(2)メソッド領域には、ロードされたクラスの情報(名前、修飾子など)、クラス内の静的変数、クラス内の最終型として定義された定数、クラス内のフィールド情報、クラス内のメソッド情報が格納されます。 , 開発者が Class オブジェクトの getName や isInterface などのメソッドを通じてプログラム内の情報を取得すると、これらのデータはメソッド領域から取得されると同時に、特定の条件下ではメソッド領域もグローバルに共有されます。領域に必要なメモリがその許容サイズを超えると、OutOfMemory エラー メッセージがスローされます。

5ブロック目:Runtime Constant Pool(ランタイムコンスタントプール)

は、クラス内の固定定数情報、メソッド、フィールド参照情報を格納し、その領域はメソッド領域から割り当てられます。

6 番目のブロック: ネイティブ メソッド スタック

JVM は、ネイティブ メソッド スタックを使用して、ネイティブ メソッドの実行をサポートします。この領域は、各ネイティブ メソッド呼び出しのステータスを保存するために使用されます。

8. JVM ガベージ コレクションの基本原理

GC (

ガベージ コレクション

): GC で使用されなくなったオブジェクトをリサイクルする方法は、GC が消費する必要があるため、コレクターと呼ばれます。ある程度のリソースと時間をかけて、Java はオブジェクトのライフサイクル特性を分析した後、新世代と旧世代に応じてオブジェクトを収集し、アプリケーションへの GC による一時停止を可能な限り短縮します (1) 新世代古い世代のオブジェクトのコレクションはマイナー GC と呼ばれます

(2) 古い世代のオブジェクトのコレクションはフル GC と呼ばれます

(3) プログラム内で System.gc() を積極的に呼び出すことによって強制される GCフルGCです。

さまざまなオブジェクト参照タイプ、GC はさまざまな方法を使用してリサイクルします。 JVM オブジェクト参照は、次の 4 つのタイプに分類されます。

(1) 強参照: デフォルトでは、オブジェクトは強参照を使用します (このオブジェクトのインスタンスには他のオブジェクト参照がなく、GC でのみリサイクルされます)

(2) ソフト参照: ソフト参照は Java で提供されます。キャッシュシナリオにより適しています (メモリが十分でない場合にのみ GC されます)

(3) 弱い参照: GC 中に GC によって確実にリサイクルされます

(4) 仮想参照: 仮想参照によるものオブジェクトが GC されたかどうかを確認します

主なコンテンツは、http://baike.baidu.com/link?url=r1DppgYdvfVHc2I0uVBfCgYd0MiNXrSMKU-E3AL_O5yvrQ3fL1FNvpNgS9MUk9H-#4 および http://wenku.baidu.com/link? から取得しています。 url =UXf-aoHl8YCX535q4G2qC48OExWk9ttLaIPW4Qn-GvdeSrM0WSjuAbq_78MJUrHq46ZS-8OsHDCMKkwmJTmXkPrkBZmbNqOA49iDyxsLIkm

1. JVM とは何ですか?

JVMとはJava Virtual Machineの略称で、実際のコンピュータ上で様々なコンピュータの機能を模擬して実現される仮想のコンピュータです。 Java 仮想マシンには、バイトコード命令のセット、レジスターのセット、スタック、ガベージ コレクション ヒープ、およびストレージ メソッド フィールドが含まれます。 JVM は特定のオペレーティング システム プラットフォームに関連する情報をシールドするため、Java プログラムは Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけでよく、変更することなくさまざまなプラットフォーム上で実行できます。 JVM がバイトコードを実行するとき、実際には最終的にバイトコードを特定のプラットフォームで実行するためのマシン命令に解釈します。

Java 言語の非常に重要な特徴は、プラットフォームから独立していることです。この機能を実現するには、Java 仮想マシンの使用が鍵となります。一般的な高級言語を異なるプラットフォームで実行したい場合は、少なくとも異なるターゲット コードにコンパイルする必要があります。 Java 言語仮想マシンの導入後は、別のプラットフォームで実行するときに Java 言語を再コンパイルする必要はありません。 Java 言語は、Java 仮想マシンを使用して特定のプラットフォームに関連する情報をシールドします。そのため、Java 言語コンパイラは、Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけでよく、変更することなく複数のプラットフォーム上で実行できます。 。 Java 仮想マシンはバイトコードを実行するときに、そのバイトコードを特定のプラットフォームで実行するためのマシン命令に解釈します。これが、Java が「一度コンパイルすれば、どこでも実行できる」理由です。

2. JRE/JDK/JVMの関係は何ですか?

JRE (JavaRuntimeEnvironment、Java 実行環境)、Java プラットフォームです。すべての Java プログラムは JRE で実行する必要があります。一般ユーザーは開発したJavaプログラムを実行し、JREをインストールするだけで済みます。

JDK (Java Development Kit) は、プログラム開発者が Java プログラムをコンパイルおよびデバッグするために使用する開発ツール キットです。 JDK ツールも Java プログラムであり、JRE を実行する必要があります。 JDK の独立性と整合性を維持するために、JDK のインストール プロセス中に JRE もインストールの一部として組み込まれます。したがって、JDK インストール ディレクトリの下に jre という名前のディレクトリがあり、JRE ファイルの保存に使用されます。

JVM (JavaVirtualMachine、Java 仮想マシン) は JRE の一部です。コンピュータのさまざまな機能を実際のコンピュータ上で模擬して実現した架空のコンピュータです。 JVM には、プロセッサ、スタック、レジスタなどの独自の完全なハードウェア アーキテクチャがあり、対応する命令システムもあります。 Java 言語の最も重要な機能は、クロスプラットフォーム操作です。 JVM を使用する目的は、オペレーティング システムの独立性をサポートし、クロスプラットフォームを実現することです。

3. JVM の原則

JVM は Java のコアであり基盤であり、Java コンパイラーと OS プラットフォームの間の仮想プロセッサーです。これは、基礎となるオペレーティング システムとソフトウェア メソッドを使用して実装されたハードウェア プラットフォームに基づく抽象的なコンピュータであり、その上で Java バイトコード プログラムを実行できます。

Java コンパイラーは、JVM に合わせて、JVM が理解できるコードまたはバイトコード ファイルを生成することのみが必要です。 Java ソース ファイルはバイトコード プログラムにコンパイルされ、各命令は JVM を通じてさまざまなプラットフォーム用のマシンコードに変換され、特定のプラットフォームで実行されます。

4. JVM がプログラムを実行するプロセス

1) .class ファイルのロード 2) メモリの管理と割り当て 3) ガベージコレクションの実行

JRE (Java 実行環境) によって構築された Java プログラムの実行JVM リングは Java プログラムが実行される環境でもありますが、同時にオペレーティング システム、アプリケーション、プロセスでもあるため、独自のコードとデータだけでなく、独自の実行ライフ サイクルもあります。空間。 JVM は jdk 全体の最下部にあり、オペレーティング システムの相互作用を担当し、オペレーティング システム環境を保護し、完全な Java 実行環境を提供するために使用されるため、仮想コンピュータでもあります。オペレーティング システムの JVM のロードは、jdk の Java.exe によって完了します。JVM 環境は、次の 4 つの手順で完成します。 1) JVM ロード環境の作成と構成 2) JVM.dll のロード 3) JVM.dll の初期化と JNIENV へのマウント( JNI 呼び出しインターフェース) インスタンス 4) JNIEnv インスタンスを呼び出して、クラス class をロードして処理します。

5. JVM ライフサイクル

1) JVM インスタンスは、プロセス レベルで開始される、独立して実行される Java プログラムに対応します
a)。 Java プログラムが開始されると、JVM インスタンスが生成されます。 public static void
main(String[] args) 関数を持つクラスは、JVM インスタンスを実行するための開始点として使用できます
b)。 main() はプログラムの初期スレッドの開始点として機能し、他のスレッドはすべてこのスレッドによって開始されます。 JVM 内には、デーモン スレッドと非デーモン スレッドの 2 種類のスレッドがあります。main() は、通常、JVM 自体によって使用されるスレッドであることを示します。作成されたのはデーモン スレッドです。
c) 死亡。プログラム内のすべての非デーモン スレッドが終了すると、JVM は終了します。セキュリティ マネージャーが許可する場合、プログラムは Runtime クラスまたは System.exit() を使用して終了することもできます

2) JVM 実行エンジン インスタンスが対応します。ユーザーがプログラムを実行するスレッドには、JVM ArchitectureAclassLoader(ファイルをロードするために使用)にあります。エンジン (バイトコードの実行、またはローカル メソッドの実行)

ランタイム データ領域 (メソッド領域、ヒープ、Java スタック、PC レジスタ、ローカル メソッド スタック)

7. JVM ランタイム データ領域


    最初のブロック: PC レジスタ
  • PC レジスタは、各スレッドが次に実行する JVM 命令を格納するために使用されます。メソッドがネイティブの場合、PC レジスタには情報は格納されません。
  • 2 番目のブロック: JVM スタック

  • JVM スタックはスレッドに対してプライベートです。各スレッドが作成されると、JVM スタックは現在のスレッドにローカルの基本型変数 (Java で定義された 8 つ) を保存します。基本型: boolean、char、byte、short、int、long、float、double)、部分的な戻り結果、および非基本型のオブジェクトは、JVM スタック上のヒープを指すアドレスのみを格納します。

  • 3 番目のブロック: ヒープ

これは、JVM がオブジェクトのインスタンスと配列の値を保存するために使用する領域です。Java の new によって作成されたすべてのオブジェクトのメモリがここに割り当てられ、オブジェクトはここに割り当てられると考えられます。ヒープ メモリは GC が再利用されるまで待つ必要があります。

(1) ヒープは JVM 内のすべてのスレッドによって共有されるため、ヒープにオブジェクト メモリを割り当てるにはロックが必要となり、新しいオブジェクトに対して比較的大きなオーバーヘッドが発生します

(2) Sunオブジェクトのメモリ割り当てを効率化するために、ホットスポット JVM は作成されたスレッドに独立したスペース TLAB (スレッド ローカル アロケーション バッファ) を割り当てます。そのサイズは、TLAB 上にオブジェクトを割り当てるときに、JVM によって計算されます。この場合、JVM でのオブジェクト メモリ割り当てのパフォーマンスは基本的に C と同じくらい効率的ですが、オブジェクトが大きすぎる場合は、JVM が TLAB 上でメモリを割り当てようとします。 (3) TLAB は新しい世代の Eden Space に対してのみ機能するため、Java プログラムを作成するときは、通常、大きなオブジェクトよりも複数の小さなオブジェクトを割り当てる方が効率的です。

(4) 新しく作成されたすべてのオブジェクトは、新しい世代の Yong Generation に保存されます。 Young Generation のデータが 1 回以上の GC を乗り越えた場合、Old Generation に転送されます。新しいオブジェクトは常にエデン スペースで作成されます。

4 番目のブロック: メソッド領域

(1) Sun JDK では、この領域は PermanetGeneration (永続世代とも呼ばれます) に対応します。

(2)メソッド領域には、ロードされたクラスの情報(名前、修飾子など)、クラス内の静的変数、クラス内の最終型として定義された定数、クラス内のフィールド情報、クラス内のメソッド情報が格納されます。 , 開発者が Class オブジェクトの getName や isInterface などのメソッドを通じてプログラム内の情報を取得すると、これらのデータはメソッド領域から取得されると同時に、特定の条件下ではメソッド領域もグローバルに共有されます。領域に必要なメモリがその許容サイズを超えると、OutOfMemory エラー メッセージがスローされます。

5ブロック目:Runtime Constant Pool(ランタイムコンスタントプール)

は、クラス内の固定定数情報、メソッド、フィールド参照情報を格納し、その領域はメソッド領域から割り当てられます。

6 番目のブロック: ネイティブ メソッド スタック

JVM は、ネイティブ メソッド スタックを使用して、ネイティブ メソッドの実行をサポートします。この領域は、各ネイティブ メソッド呼び出しのステータスを保存するために使用されます。

8. JVM ガベージ コレクションの基本原理

GC (ガベージ コレクション): GC で使用されなくなったオブジェクトをリサイクルする方法は、GC が一部を消費する必要があるため、コレクターと呼ばれます。リソースと時間、オブジェクトのライフサイクル特性を分析した後、JavaはアプリケーションへのGCによる一時停止をできるだけ短縮するために、新世代と旧世代に応じてオブジェクトを収集します

(1) 新世代の場合古い世代のオブジェクトのコレクションはマイナー GC と呼ばれます

(2) 古い世代のオブジェクトのコレクションはフル GC と呼ばれます

(3) プログラム内で System.gc() を積極的に呼び出すことによって強制される GC はフル GC と呼ばれます。 GC。

異なるオブジェクト参照タイプ。GC はリサイクルするために異なるメソッドを使用します。JVM オブジェクト参照は 4 つのタイプに分類されます:

(1) 強参照: デフォルトでは、オブジェクトは強参照を使用します (このオブジェクトのインスタンスには他のオブジェクト参照がありません)。 GC 中にリサイクルされます)

(2) ソフト参照: ソフト参照は、キャッシュ シナリオに適した Java で提供されるアプリケーションです (メモリが十分でない場合にのみ GC されます) )

(3) 弱い参照: GC中に必ずGCによってリサイクルされます

(4) 仮想参照: 仮想参照はオブジェクトがGCされたかどうかを知るためにのみ使用されるため

以上がJVM の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。