ホームページ  >  記事  >  Java  >  Java仮想マシンのメモリプロトタイプ例の詳細説明

Java仮想マシンのメモリプロトタイプ例の詳細説明

零下一度
零下一度オリジナル
2017-07-21 22:04:341227ブラウズ

Java 仮想マシンのメモリ プロトタイプの 6 つの部分:

1. レジスタ: プログラムでは制御できません

2. スタック: 基本的なタイプのデータとオブジェクトへの参照を格納しますが、オブジェクト自体はスタックに格納されません、ただし、ヒープに格納されます

3. ヒープ: new を使用して生成されたデータを格納します

4. 静的ドメイン: 静的を使用してオブジェクトに定義された静的メンバーを格納します

5. 定数プール: 定数を格納します

6. 非 RAM ストレージ:ハードディスクなどの永続的なストレージ領域

Java仮想マシンのメモリプロトタイプ例の詳細説明

Java メモリ割り当てにおけるスタック

スタックの基本単位はフレーム (またはスタック フレーム) です: Java スレッドが実行されるたびに、Java 仮想マシンは Java スタックを糸。スレッドが特定の Java メソッドを実行すると、フレームが Java スタックにプッシュされ、このフレームはパラメータ、ローカル変数、オペランド、中間演算結果などを格納するために使用されます。このメソッドの実行が完了すると、フレームがスタックからポップされます。変数がコードのブロック内で定義されると、Java はスタック上の変数にメモリ領域を割り当てます。変数がスコープから出ると、Java は変数に割り当てられたメモリ領域を自動的に解放し、そのメモリ領域をすぐに使用できるようになります。他の目的に使用されること。ただし、運用する際は次の点に注意する必要があります:

1. Java スタック上のすべてのデータはプライベートであり、他のスレッドはこのスレッドのスタック データにアクセスできません。

2. すべてのオブジェクトが保存され、各オブジェクトには対応するクラスに関する情報が含まれます (クラスの目的は操作命令を取得することです)

3. JVM にはすべてのスレッドが使用するヒープ領域 (ヒープ) が 1 つだけあります。共有の基本型とオブジェクト参照はヒープに格納されず、オブジェクト自体と配列自体のみが格納されます

 栈的基本单位是帧(或栈帧):每当一个java线程运行的时候,java虚拟机会为该线程分配一个java栈。

Java メモリ割り当てのヒープ

Java 仮想マシンのヒープはオブジェクトの格納に使用されます。および new によって作成された配列。ヒープに割り当てられたメモリは、Java 仮想マシンの自動ガベージ コレクション メカニズムによって管理されます。

簡単に言えば、スタックと比較すると、ヒープは主にJavaオブジェクトの保存に使用され、スタックは主にオブジェクト参照の保存に使用されます...配列またはオブジェクトがヒープに生成された後、特別なスタック内のこの変数の値をヒープ メモリ内の配列またはオブジェクトの最初のアドレスと等しくすると、スタック内のこの変数が配列またはオブジェクトの参照変数になります。参照変数は、配列またはオブジェクトに名前を付けることと同じであり、スタック内の参照変数を使用して、プログラム内のヒープ内の配列またはオブジェクトにアクセスできます。参照変数は、配列またはオブジェクトに名前を付けることと同じです。

Java のヒープはランタイム データ領域であり、クラス オブジェクトはそこから領域を割り当てます。これらのオブジェクトは、new、newaray、anewarray、multianewarray などの命令によって作成され、プログラム コードを明示的に解放する必要はありません。ヒープはガベージ コレクションされます。ヒープの利点は、メモリ サイズを動的に割り当てることができ、実行時に動的にメモリを割り当て、Java のガベージ コレクタがこれらの使用されなくなったデータを自動的に収集するため、ライフタイムを事前にコンパイラに伝える必要がないことです。ただし、実行時にメモリが動的に割り当てられるため、アクセス速度が遅いという欠点があります。

注: 作成されたオブジェクトには独自のメンバー変数のみが含まれ、メンバー変数はそのオブジェクトに格納されません。独自のヒープですが、クラスのメソッドを共有します

補足: Java がより多くのメモリを使用する理由

参照変数はスタック上に割り当てられる通常の変数です。定義されている場合、参照変数はプログラムがそのスコープ外で実行された後に解放され、配列またはオブジェクトを生成するために新しいステートメントが使用されるコード ブロックにプログラムが実行された場合でも、配列とオブジェクト自体はヒープ内に割り当てられます。さらに、配列とオブジェクト自体が占有しているメモリは、それらを指す参照変数が存在しない場合にのみ解放されませんが、それでもメモリ空間を占有します。これが、Java がより多くのメモリを消費する理由であり、実際、Java のポインタはヒープ メモリ内の変数を参照するため、アクセス速度はヒープ メモリよりも高速です。ただし、スタックに格納されるデータのサイズと有効期間を決定する必要があり、スタックには主にいくつかの基本的なデータが格納されるという欠点があります。変数のタイプ (int、short、long、byte、float、double、boolean、char) とオブジェクト ハンドル (参照)

スタックの非常に重要な特殊機能は、スタックに格納されたデータを共有できることです。

inta=3;

intb=3;

コンパイラはまず inta=3 を処理します; まずスタック上に変数 a への参照を作成し、次にスタック上に値 3 があるかどうかを確認し、見つからない場合は 3 を格納し、次に a を指します。 3.次に、 b の参照変数を作成した後、 intb=3; を処理します。スタックにはすでに値 3 があるため、b は直接 3 を指します。このように、a と b が同時に 3 を指す状況が発生します。

このとき、a=4 が再度設定されると、コンパイラはスタックに 4 の値があるかどうかを再度検索し、ない場合は 4 を格納し、すでに存在する場合は 4 をポイントします。このアドレスを直接指します。したがって、a の値が変化しても b の値には影響しません。

この種のデータ共有は、2 つのオブジェクトの参照が同時に 1 つのオブジェクトを指す共有とは異なることに注意してください。この場合、a の変更は b に影響を与えないためです。コンパイラ。スペースの節約に役立ちます。オブジェクト参照変数がオブジェクトの内部状態を変更すると、別のオブジェクト参照変数に影響を与えます。

定数プール (constantpool)

Java仮想マシンのメモリプロトタイプ例の詳細説明

定数プールとは、コンパイル中に決定され、コンパイルされた .class ファイルに保存される一部のデータを指します。コード内で定義されたさまざまな基本型 (int、long など) とオブジェクト型 (String や配列など) を含む定数値 (final) に加えて、テキスト形式のいくつかのシンボル参照も含まれます。例:

1. クラスとインターフェースの完全修飾名;

2. フィールド名と記述子; 3. メソッド、名前、および記述子。

仮想マシンは、ロードされたタイプごとに一定のプールを維持する必要があります。文字列定数の場合、その値は定数プールにあります。定数プールは、この型で使用される定数の順序付きセットで、直接定数 (文字列、整数、浮動小数点定数) や他の型、フィールド、メソッドへのシンボリック参照が含まれます。 JVM の定数プールは、メモリ内にテーブルの形式で存在します。String 型の場合、リテラル文字列値を格納するために使用される固定長の CONSTANT_String_info テーブルがあります。 注: このテーブルには、シンボルではなくリテラル文字列値のみが格納されます。 。

以上がJava仮想マシンのメモリプロトタイプ例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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