Java-virtual-machine-runtime-data-areas

提供:Dev Guides
移動先:案内検索

Java仮想マシン-ランタイムデータ領域

JVM仕様は、プログラムの実行中に必要な特定の実行時データ領域を定義しています。 それらの一部は、JVMの起動時に作成されます。 その他はスレッドに対してローカルであり、スレッドが作成されたときにのみ作成されます(スレッドが破棄されると破棄されます)。 これらは以下にリストされています-

PC(プログラムカウンター)レジスタ

各スレッドに対してローカルであり、スレッドが現在実行しているJVM命令のアドレスが含まれています。

スタック

各スレッドに対してローカルであり、メソッド呼び出し中にパラメーター、ローカル変数、およびリターンアドレスを格納します。 スレッドが許可されているよりも多くのスタックスペースを必要とする場合、StackOverflowエラーが発生する可能性があります。 スタックが動的に拡張可能な場合でも、OutOfMemoryErrorをスローできます。

Heap

すべてのスレッド間で共有され、実行時に作成されるオブジェクト、クラスのメタデータ、配列などが含まれます。 JVMの起動時に作成され、JVMのシャットダウン時に破棄されます。 特定のフラグを使用して、JVMがOSに要求するヒープの量を制御できます(これについては後で説明します)。 重要なパフォーマンスへの影響があるため、必要なメモリが少なすぎたり多すぎたりしないように注意する必要があります。 さらに、GCはこのスペースを管理し、デッドオブジェクトを継続的に削除してスペースを解放します。

メソッドエリア

この実行時領域はすべてのスレッドに共通であり、JVMの起動時に作成されます。 定数プール(詳細は後述)、コンストラクターとメソッドのコード、メソッドデータなどのクラスごとの構造を格納します。 JLSは、この領域をガベージコレクションする必要があるかどうかを指定しないため、JVMの実装はGCを無視することを選択できます。 さらに、これはアプリケーションのニーズに応じて拡張される場合とされない場合があります。 JLSはこれに関して何も強制しません。

実行時定数プール

JVMは、ロードされたクラスをリンクするときにシンボルテーブル(多くのロールの1つ)として機能するクラスごと/タイプごとのデータ構造を維持します。

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

スレッドがネイティブメソッドを呼び出すと、Java仮想マシンの構造とセキュリティ制限がその自由を妨げることのない新しい世界に入ります。 ネイティブメソッドは、仮想マシンのランタイムデータ領域にアクセスする可能性があります(ネイティブメソッドインターフェイスに依存します)が、必要な他のすべての操作も実行できます。

ガベージコレクション

JVMは、Javaのオブジェクトのライフサイクル全体を管理します。 オブジェクトが作成されると、開発者はそれを心配する必要がなくなります。 オブジェクトが死んだ場合(つまり、オブジェクトへの参照がなくなった場合)、シリアルGC、CMS、G1などの多くのアルゴリズムのいずれかを使用して、GCによってヒープから排出されます。

GCプロセス中に、オブジェクトはメモリ内で移動されます。 したがって、プロセスが進行している間、これらのオブジェクトは使用できません。 プロセス全体の間、アプリケーション全体を停止する必要があります。 このような一時停止は「世界を停止する」一時停止と呼ばれ、大きなオーバーヘッドです。 GCアルゴリズムは、主にこの時間を短縮することを目的としています。 これについては、次の章で詳しく説明します。

GCのおかげで、メモリリークはJavaでは非常にまれですが、発生する可能性があります。 Javaでメモリリークを作成する方法については、後の章で説明します。