1。概要
Java Virtual Machineは、これらの領域を実行して破壊するための独自の使用と時間を実行するプロセスで、いくつかの異なるデータ領域に管理するメモリを分割します。 Java Virtual Machineが管理するメモリには、以下の図に示すように、次のランタイムデータ領域が含まれます。
以下はすべての領域で説明されています。
第二に、データ領域<br />プログラムカウンター<br />プログラムカウンターは、現在のスレッドで実行されたバイトコードの行番号インジケーターと見なすことができます。仮想マシンの概念モデルでは、ワークコードインタープリターの作業は、プログラムカウンターの値を変更することで実行する必要があるバイトコード命令を選択することです。スレッドの回復およびその他の基本機能は、すべてを完了するためにこのカウンターに依存している必要があります。
マルチスレッドでは、スレッドが正しい実行位置に戻るためには、各スレッドが互いに影響を与え、このメモリはプライベートになります。
スレッドが実行されている場合、このカウンターは、ネイティブメソッドが実行されている仮想マシンバイトコード命令のアドレスを記録します。
このメモリ領域は、outofmemoryerrorを指定していない唯一の領域です。
Java仮想マシンスタック
Java仮想マシンスタックもプライベートであり、そのライフサイクルはスレッドと同じです。仮想マシンスタックは、Javaメソッドによって実行されるメモリモデルを説明します。各メソッドは、ローカル変数テーブルを保存し、スタックを操作し、動的リンクリスト、メソッドエクスポート情報などを保存するスタックフレームを作成します。呼び出しのプロセスから完了プロセスが呼び出されるまで、仮想マシンスタック内のスタックをスタックに入力するプロセスに対応します。
ローカル変数テーブルでは、さまざまな基本データ型(ブール、バイト、チャー、ショート、フロート、ロング、ダブル)、オブジェクト参照、および返信型型がコンパイラに保存されます。
拡張中に十分なメモリを申請できない場合は、OutFmeMoryErrorの例外がスローされます。
ローカルメソッドスタック<br />ローカルメソッドスタックは、仮想マシンスタックが仮想マシンによって実行されるJavaメソッドを提供することです。 。一部の仮想マシンは、ローカルメソッドスタックと仮想マシンスタックを1つに直接組み合わせます。
StackoverFlowerrorとOutOfMemoryError異常を投げます。
Java Pile
Java Pileは、すべてのスレッドで共有されるメモリ領域です。
Java Pileは、ゴミコレクター管理の主要な領域です。コレクターは基本的にリサイクルアルゴリズムの分割に使用されているため、Javaの山は、新世代と老年として分割することもできます。メモリ分布の観点から見ると、スレッド-hared Java Pileは、複数のスレッドを個人分散バッファー(TLAB)を分割する場合があります。
Javaの山は、論理的に連続している限り、物理的な不連続なメモリスペースにある可能性があります。実装の観点から、固定サイズや拡張機能を達成することはできません。
ヒープにメモリ完了インスタンスの割り当てがなく、パイルを完成できない場合、OutofMemoryErrorは捨てられます。
メソッド領域
メソッド領域は、さまざまなスレッドで共有されるメモリ領域です。これは、情報、定数、静的変数、および仮想マシンによってコンパイルされたインスタントコンパイラなどのデータを保存するために使用されます。
比較的言えば、この領域にはゴミ収集の動作が現れませんでしたが、入力のメソッド領域に永続的に存在するわけではありません。
メソッド領域がメモリ分布のニーズを満たすことができない場合、OutofMemoryErrorは捨てられます。
一定のプールを実行する:
メソッド領域の一部であり、コンピレーション期間によって生成されたさまざまなタイプとシンボル参照を保存するために使用されます。
直接メモリ
直接的なメモリは、仮想マシンが実行されている場合、チャネルとバッファーに基づくIOメソッドを導入できます。
直接メモリの割り当てはJava Pileのサイズによって制限されませんが、メモリのサイズによって制限され、すべてがOutMemoryRerrorの例外を投げることもあります。
第三に、オブジェクトの作成、レイアウト、アクセスプロセス
オブジェクト作成
通常、オブジェクトを作成するには、新しいキーワードが必要な場合、まずこの命令のパラメーターが一定のプール、分析、および初期化に配置されているかどうかを確認します。対応するクラスロードプロセスが実行された場合。
クラスがロードされた後、仮想マシンは新しい学生にメモリを割り当てます。オブジェクトにスペースを割り当てるタスクは、Java Pileのサイズで決定されるメモリの一部を分割するのと同等です。割り当てられる2つの方法があります。1つはポインター衝突と呼ばれます。 別の名前は空のリスト:Java Pileのメモリが通常のものではない場合、仮想マシンは1つのリストを維持する必要があります。オブジェクトインスタンス。リストのレコードを更新します。 どの分布方法がJavaヒープが規制されているかどうか、およびJavaヒープがコンプレッションと組織機能で使用されるかどうかによってJavaヒープが決定されるかどうかによって決定されます。 別の問題を考慮する必要があるのは、オブジェクトが2つの解決策を作成するときです。 Java Pileのメモリ(TLAB)のTLABに割り当てられたスレッド。
メモリ分布が完了した後、仮想マシンは分散メモリスペースをゼロ値に初期化する必要があります。この手順により、オブジェクトのインスタンスフィールドが、初期値なしでJavaコードで直接使用できるようにします。
次に、仮想マシンは、このオブジェクトのどのクラスがクラスのインスタンスであるか、クラスのメタデータ情報を見つける方法など、必要な設定を設定する必要があります。この情報はオブジェクトのオブジェクトヘッドに保存されます。
上記の作業が完了した後、仮想マシンの観点から新しいオブジェクトが生成されました。ただし、Javaプログラムの観点から見ると、プログラマーの希望に応じてオブジェクトを初期化するためには、INITメソッドも必要です。
オブジェクトのメモリレイアウト
ホットスポット仮想マシンでは、メモリ内のオブジェクトのレイアウトは、オブジェクトヘッド、インスタンスデータ、アライメントフィリングの3つの部分に分割できます。
オブジェクトヘッドには2つの部分が含まれています。最初の部分は、ハッシュコード、GC老化年齢、スレッドで保持されているロックなど、オブジェクト自体のデータを保存するために使用されます。役人は「マークワード」と呼ばれます。 2番目の部分はタイプポインター、つまりクラスメタドデータへのオブジェクトのポインターであり、仮想マシンはこのポインターによってこのオブジェクトのクラスがどのクラスであるかを決定します。
インスタンスデータは、オブジェクトに保存されている効果的な情報であり、プログラムコードで定義されているさまざまなフィールドコンテンツでもあります。
アライメント充填は必ずしも存在するわけではなく、占領キャラクターの役割を果たすだけです。 、Hotpot VMは、オブジェクトの開始アドレスが8バイトの整数であることを要求しています。アライメント。
オブジェクトアクセスポジショニング
Javaプログラムは、スタック上の参照データを介してスタック上の特定のオブジェクトを操作します。主なアクセス方法は、ハンドルと直接ポインターの2つのタイプです。
スタッフ: Java Heapsは、ハンドルプールとしてメモリを描画します。図に示されているように:
直接ポインター: Java Pileオブジェクトのレイアウトは、アクセスの種類のタイプデータの関連情報を配置する方法を検討する必要があり、オブジェクトアドレスが参照に保存されます。図に示されているように:
2つのメソッドには、ハンドルを使用することの最大の利点がありますポインターポジショニングの時間支出。
上記は、この記事のすべての内容です。