JVM研究ノート(1)---ランタイムデータ領域

ランタイムデータ領域

プログラムカウンタ

プログラムカウンタ(プログラムカウンタレジスタ)は、スレッドの実行の現在の行番号の指標として見ることができる、小さなメモリ空間です。仮想マシンのの概念モデルでは(唯一の概念モデル、仮想マシンの様々な、より効率的な方法を達成するため、いくつか通過するかもしれない)、仕事でバイトコードインタプリタが実行されるカウンタの値を変更することによって選択される場合命令、分岐、ループ、分岐、例外処理、スレッドの履歴書およびその他の基本的な機能は、完了するために、カウンターに依存する必要があります。
マルチスレッドのJava仮想マシンが順番に達成するために、スレッドによってモード実行時間とプロセッサの割り当てを切り替えているので、いつでも決定において、プロセッサ(マルチコアプロセッサのためには、カーネルである)のみを実行します命令のスレッド。したがって、正しい実行位置にスレッドの切り替えを復元するために、各スレッドが別々のプログラムカウンタを必要とし、各スレッドが互いに独立して、独立した店の、私たちは「スレッドプライベート」メモリのメモリ領域のこのタイプを呼び出します。
スレッドは、Javaメソッドを実行している場合、ネイティブメソッドが実行された場合、カウンタは、実行中の仮想マシンのバイトコード命令のアドレスを記録し、カウンタの値がヌルである、これは、Javaで唯一のメモリ領域であります仮想マシンの仕様は、任意の領域のOutOfMemoryErrorの状況を指定していません。

Java仮想マシン・スタック

プログラムカウンタと同じように、Java VMのスタックは(Java仮想マシンスタック)も、スレッドプライベート、そのライフサイクルと同じスレッドです。仮想マシンのスタック・メモリ・モデルは、実行するJavaメソッドを説明し、情報を記憶するためのローカル変数テーブルを行いながら各方法は、スタックフレーム(スタック・フレーム)を作成し、オペランドスタック、動的リンク、方法輸出。手順が完了するまで、各メソッドの実行は、スタックにスタックから仮想マシンで、対応するスタックフレーム処理と呼ばれています。
Java仮想マシン仕様で知られているコンパイラのデータベース、オブジェクト参照とreturnAdress(バイトコード命令を指し示すアドレス)の様々な種類を格納するためのローカル変数の表は、この異常な状態は、2つの領域を指定する:スレッド要求場合スタックの深さは、例外がスローされます仮想マシン許容にStackOverflowErrorの深さよりも大きい、仮想マシンを動的に拡張することができれば十分なメモリを適用するように拡張されていない場合、それはOutOfMemoryErrorがスローされます。

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

ネイティブメソッドスタック(ネイティブメソッドスタック)と、仮想マシンのスタックマルチ役割は非常に似ていますが、それらの間の違いは、仮想マシンのスタックのjava(バイトコード)サービスの実装で、ローカルスタック方法は、仮想マシンを使用していましたネイティブサービス。仮想マシンのスタックのように、ネイティブメソッドではStackOverflowErrorがスタックし、OutOfMemoryErrorがスローされます。

Javaヒープ

Javaヒープ(Javaヒープ)メモリは、Javaヒープは、メモリ領域内のすべてのスレッドで共有され、Java仮想マシン管理の最大の作品です仮想マシンの起動時に作成されます。このメモリ領域の唯一の目的は、ほぼすべてのオブジェクトインスタンスがメモリを割り当てるためにここにいる、オブジェクトのインスタンスを格納しています。これは、Java仮想マシン仕様で説明されている:ヒープに割り当てされるすべてのオブジェクトインスタンスと配列が、スタック上のJITコンパイラ技術が成熟し、分析を逃れ、割り当ての発展とともに、スカラー交換技術は、最適化されますいくつかの微妙な変化を引き起こし、すべてのオブジェクトが徐々に少なく、「絶対に」なったヒープに割り当てられています。
Javaヒープは、ガベージコレクタによって管理されるメインエリアであるため、多くの場合も、「GCヒープ」(ガベージコレクトヒープ)と呼ばれます。メモリリコールの観点から、今のコレクターは、基本的な世代のコレクションアルゴリズムを採用しているため、Javaヒープはまたに分けることができます。新世代と旧年:エデンのスペースは、生存空間から、生存空間に、より慎重に再びがあります。スレッドJavaヒープによって共有ビューのメモリ割り当て点の観点からプライベート(ローカル割当バッファ、TLABスレッド)バッファを割り当てる複数のスレッドに分割してもよいです 。しかし、分割どのような場合には、更なる目的は、メモリのよりよい回復にある、またはより良いメモリを割り当てる分割に関係なく、面積、まだ保存されているオブジェクトインスタンスの、コンテンツの保存とは何の関係もありません。
Java仮想マシンの下では、Javaヒープは、ちょうど私達のディスクのように、限り、論理的に連続に、不連続な物理メモリ空間であってもよいです。実装時のいずれかは、固定サイズとして実装することができ、およびヒープにはメモリがない場合にも、拡張が、現在主流の仮想マシンが拡張可能である、(-Xmxと-Xmsによって)達成することができます完了インスタンスの割り当て、およびヒープを拡張することができない時に、それはOutOfMemoryErrorがスローされます。

メソッド地区

ちょうど店のクラス情報に使用されている各スレッドの共有メモリ領域として、Javaヒープで(メソッド領域)に移動するための方法は、仮想マシンにロードされている、定数は、静的変数は、タイムコンパイラは、コードやその他のデータをコンパイルします。

ランタイム定数プール

実行時定数プール(実行時定数プール)ゾーン法の一部です。情報クラスバージョン、フィールド、メソッド、インターフェース、等に加えて、クラス・ファイルは、定数プール(定数プールテーブル)があり、コンパイラによって生成される種々のリテラル参照シンボルを格納するため、この部分になりますクラスローディング動作の後領域に入る方法は、定数プールに格納されています。
各クラスファイル部分について厳格な要件、仕様の要件を満たさなければならないデータのバイトを格納するための各仮想マシンのみ、ロードおよび実行によって認識されたが、あるフォーマット(天然に定数プールを含む)Java仮想マシン。しかし、実行時定数プール、Java仮想マシン仕様の詳細については、任意の要求をせずに。
クラスの他の重要な特徴にランタイム定数プールの相対定数プールのダイナミクスを持つことである、JAVA言語がのみ生成するためにコンパイル必ずしも一定で必要としない、ゾーンの実行方法を入力するには、クラスファイルの定数プールの内容を事前に設定されていないこと動作中の時定数プールはプールに新しい一定であってもよいし、この機能が開発されたインターン()メソッドは、たくさんの人員が文字列を使用しています。

ダイレクトメモリ

ダイレクトメモリ(ダイレクトメモリ)が実行されている仮想マシンのデータ領域の一部ではない、ないJava仮想マシンの仕様は、メモリの領域を定義します。
JDK1.4が新たチャネル(チャネル)の導入に基づいて、NIO(新しい入力/出力)タイプ、およびI / Oモードのバッファ(バッファ)に加え、それがネイティブライブラリ直接外部メモリヒープ割り当てを使用することができ、そして動作メモリとしてこの参照されたオブジェクトは、Java DirectByteBuffer介しヒープに格納されています。これはかなりそれは、ヒープとヒープのJavaネイティブに複製データを回避し、いくつかのシナリオでは、パフォーマンスを向上させることができます。

おすすめ

転載: www.cnblogs.com/curiousforcode/p/11388896.html