ホームページ  >  記事  >  Java  >  Javaにおけるメモリ領域の分割

Javaにおけるメモリ領域の分割

王林
王林転載
2019-11-29 16:54:372167ブラウズ

Javaにおけるメモリ領域の分割

JVM とは何ですか?

JVM とは Java Virtual Machine (Java 仮想マシン) の略称で、計算機の仕様であり、実際のコンピュータ上でシミュレーションにより擬似的に実現される架空のコンピュータであり、コンピュータのさまざまな機能を指します。 Java 仮想マシンには、バイトコード命令のセット、レジスターのセット、スタック、ガベージ コレクション ヒープ、およびストレージ メソッド フィールドが含まれます。

JVM は特定のオペレーティング システム プラットフォームに関連する情報をシールドするため、Java プログラムは Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけで済み、変更を加えずに複数のプラットフォーム上で実行できます。 JVM がバイトコードを実行するとき、実際には最終的にバイトコードを特定のプラットフォームで実行するためのマシン命令に解釈します。

JVM メモリ領域

実行中、JVM は管理するメモリを複数の領域に分割します。各領域には独自の目的とライフサイクルがあります。メモリ パーティションの図に基づいて、それらを 1 つずつ分解してみましょう。

Javaにおけるメモリ領域の分割

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

プログラム カウンターは、小さな領域を占めます。メモリの量。その役割は、現在のスレッドによって実行されたバイトコードのインジケータとして見ることができます。カウンタの値を変更することで、次のバイトコード命令を取得できます。

プログラム カウンタがネイティブ メソッドを実行すると、カウンタの値は空 (未定義) になります。

プログラム カウンタはスレッドプライベートであり、各スレッドに 1 つ割り当てられます。

オンライン ビデオ チュートリアルの共有: java 学習

仮想マシン スタック (VM スタック)

仮想マシン スタックが実行されますJVM Java メソッド サービスにより、各メソッドが実行されると、ローカル変数テーブル、オペランド スタック、ダイナミック リンク、メソッド出口などの情報を格納するスタック フレームが作成されます。各メソッドの呼び出しから実行終了までが、仮想マシンスタックからスタックフレームをプッシュしてポップアウトするまでの処理に相当します。

仮想マシン スタックのローカル変数テーブルには、次のデータが格納されます。

基本型データ (boolean、byte、char、short、int、float、long、double)

オブジェクトリファレンス(参照型)

returnAddress型(バイトコード命令のアドレスを指す)

ローカル変数テーブルに必要なメモリ空間は、実行時に決定されることに注意してください。コンパイルすると、サイズは変更されなくなります。

仮想マシン スタックもスレッドプライベートであり、各スレッドに 1 つが割り当てられます。

JVM は、仮想マシン スタックに対して 2 つの例外を指定します。

StackOverflowError: スレッドによって要求されたスタックの深さが、仮想マシンによって許可される深さを超えています。

OutOfMemoryError: 仮想マシン スタックは動的に拡張できますが、拡張中にメモリ不足を適用できない場合。

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

ローカル メソッド スタックは仮想マシン スタックに似ていますが、主な違いは、ローカル メソッド スタックが特にネイティブ メソッド用のサービスを提供することです。

ネイティブ メソッド: Java の Native キーワードによって宣言され、非 Java 言語で実装されたメソッドは、ローカル ライブラリによって提供されるサードパーティ言語メソッドを参照します。

ローカル メソッド スタックもスレッドプライベートであり、各スレッドが 1 つを割り当てます。

ヒープ

ヒープは、すべてのスレッドによって共有されるメモリ領域です。JVM の起動時に作成されます。通常、JVM 内の最大の領域です。ガベージ コレクター (GC によって管理されるメイン領域)。

ヒープに格納される主なデータは次のとおりです:

Object

Array

ヒープは物理的に不連続であっても構いませんが、論理的に連続していれば問題ありません。 、したがって拡張可能なメモリ領域です。

ヒープ メモリ サイズがオブジェクトまたは配列を作成するのに十分ではなく、拡張できない場合、OutOfMemoryError 例外がスローされます。

メソッド領域 (メソッド領域)

メソッド領域は、すべてのスレッドで共有されるメモリ領域でもあります。

メソッド領域に格納される主なデータは次のとおりです。

JVM によってロードされたクラス情報

定数 (jdk1.7 以降、ランタイム定数プールには

静的変数

ジャストインタイム コンパイラによってコンパイルされたコードとその他のデータ

ガベージ コレクター (GC) がこの領域に現れることはほとんどありません。主なメモリのリサイクル ターゲットは、定数プールのリサイクルと型のアンロードです。

メソッド領域がメモリ割り当て要件を満たさない場合、OutOfMemoryError 例外がスローされます。

定数プール (実行時定数プール)

定数プールはメソッド領域の一部であり、コンパイル中に生成されるさまざまなリテラルおよびシンボル参照を格納するために使用されます。定数は、コンパイル時と実行時 (String の intern()) の両方でプールに入れることができます。メモリには制限があり、適用できない場合は OutOfMemoryError 例外がスローされます。

jdk1.7 以降、ランタイム定数プールはヒープに移動されました。

ダイレクト メモリ

ダイレクト メモリは、JVM ランタイム メモリ データ領域ではなく、JVM 仕様で定義されているメモリでもありません。

ダイレクト メモリは物理メモリのサイズを占有します。JVM メモリを割り当てるときにダイレクト メモリを含めるように注意する必要があります。そうしないと、メモリを動的に拡張するときに OutOfMemoryError 例外が発生する可能性があります。

おすすめの関連記事チュートリアル: Java 入門

以上がJavaにおけるメモリ領域の分割の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。