Javaのメモリ領域:初日の要約で高強度の学習とトレーニング

--- ---復元コンテンツ始まります

プログラムカウンタ:

プログラムカウンタ(プログラムカウンタレジスタが)小さなスペースで、彼は現在の実行スレッドのインジケータバイトコードの行番号として見ることができます。仮想マシンのの概念モデルでは(唯一の概念モデル、仮想マシンの様々な、より効率的な方法を達成するため、いくつか通過するかもしれない)、仕事でバイトコードインタプリタが実行されるカウンタの値を変更することによって選択される場合バイトコード命令は、例外処理スレッドジャンプ分岐ループ回復機能が完了するには、このカウンタを元に依存する必要があります。マルチスレッドのJava仮想マシンを達成するために、スレッドによって順次切り替え、プロセッサ実行時間の配分されているので、いつでも決定において、プロセッサ(マルチコアプロセッサのためには、単にカーネルである)、のみ実行されます命令のスレッド。したがって、正しい実行位置にスレッドスイッチを復元するために、各スレッドは、我々はスレッドプライベート・メモリのような領域を呼び出し、独立して、スレッド間で互いの、別のプログラムカウンタを必要とする、独立した店舗。

スレッドは、Javaメソッドを実行している場合、このカウンタは、実行中の仮想マシンのバイトコード命令のアドレスを記録します。このカウンタの値がnullの場合、ネイティブメソッドが実行されています。このメモリ領域は、地域のOutOfMemoryError Java仮想マシン仕様でどのような状況のために用意されていませ唯一のものです。

Java仮想マシン・スタック:

プログラムカウンタと同じように、Java仮想マシン・スタック(Java仮想マシンスタック)も、スレッドプライベート、そのライフサイクルと同じスレッドです。仮想マシンのスタックのJavaメモリ・モデルは、記載された方法が行われる:各メソッドは、同時に情報が格納されているローカル変数テーブルの実装のためのスタックフレーム、オペランドスタック、動的リンク、方法輸出を作成します。スタックフレームの実行から完了までの各メソッド呼び出しは、スタックからスタックにプッシュする仮想マシンの処理に相当します。

多くの場合、それはタスクが少しラフだったこと、Javaのメモリヒープとスタックメモリに置かれている、Javaのメモリ領域は、これよりも実際には複雑で割ます。人気はこの部門だけで、ほとんどのプログラマが最も懸念していることを示唆することができ、オブジェクトのメモリの割り当てとの関係は、メモリと、おそらくブロックの最も親密なエリアです。スタックは、仮想マシンのスタック、または仮想マシンのスタックのローカル変数テーブルセクションについて話しています。

さまざまなデータ型(ブール、バイト、文字、ショート、整数、フロート、長い、二重)既知のコンパイラ、オブジェクト参照(参照タイプを格納するローカル変数テーブルは、オブジェクト自体と同等ではなく、オブジェクトが出発点であってもよいです参照開始アドレスポインタは、ポイントは、ハンドルまたは他のオブジェクトのオブジェクトのこの位置に関連付けられている)とRETURNADDRESSタイプ(アドレスはバイトコード命令を指す)を表すことができます。

長いダブル長さ64ビットのデータは、2つのローカル変数空間(スロット)を占有し、前記残りのデータは、一種類のみを占有します。コンパイル時に割り当てられたメモリ空間内で所望の局所変数テーブルはメソッドを入力する場合、このメソッドは完全に定義されたスタックフレームに割り当てられたローカル変数の多くのスペースを必要とし、完了すると、この方法は、ローカル変数テーブルの動作中に変更されません。サイズ。

Java仮想マシン仕様では、このエリアには、異常の2種類が用意されています。スタックは、スレッドの深さは、仮想マシンの許容深さを要求されたよりも大きい場合、にStackOverflowErrorが例外をスローします。仮想マシンを動的にスタックを展開することができれば、あなたは拡張子場合に適用することはできません十分なメモリ、それはOutOfMemoryErrorがスローされます。

 

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

ネイティブサービスの方法を使用しながら、ネイティブメソッドスタック(ネイティブメソッドスタック)と、仮想マシンのスタックが果たした役割は非常に似ていますが、それらの間の差は、仮想マシンのスタックの実装はJavaバイトコードです、ネイティブメソッドスタック。仮想マシンの仕様では、言語のネイティブメソッドスタック法を用い口述ので、特定の仮想マシンには、それを実装して自由ではありません。直接ネイティブメソッドスタックに(例えば太陽のHotSpot仮想マシンなど)であっても、いくつかの仮想マシン、そして合わせ仮想マシンスタック。仮想マシンのスタックのように、ローカル局のエリア方法もにStackOverflowErrorとOutOfMeoryErrorを投げることができます

Javaヒープ:

ほとんどのアプリケーションでは、Javaヒープ(Javaヒープ)は、Java仮想マシン管理におけるメモリの最大の作品です。Javaヒープは、仮想マシンの起動時に作成されたすべてのスレッドで共有面積、です。このメモリ領域の唯一の目的は、ほぼすべてのオブジェクトインスタンスがメモリを割り当てるためにここにいる、オブジェクトのインスタンスを格納しています。これは、Java仮想マシン仕様で説明されている:ヒープに割り当てされるすべてのオブジェクトインスタンスと配列が、JITコンパイラの開発をし、解析技術を逃れるが、配信局を成熟、スカラー交換技術は、最適化されますいくつかの微妙な変化を引き起こし、すべてのオブジェクトが徐々に少なくなり、カテゴリヒープに割り当てられています。

メソッドのエリア:

メソッド領域とJavaヒープ、各スレッドは、仮想マシンを格納するための共有メモリ領域であるとしてコード及び他のデータをコンパイルするクラス情報読み込まれ、定数、静的変数、タイムコンパイラを唱えてきました。ロジック部に記載されたJava仮想マシン仕様ビットヒープ領域の方法が、それは非ヒープという別名を持ち、Javaオブジェクトはヒープから分離されます。

HotSpot仮想マシンの開発者で癖のために、開発者がプロ​​グラムを展開する、多くの人々が永久世代と呼ばれるメソッド領域に、より喜んでいる、基本的に2つのHotSpot仮想マシンの設計チームは、GCに選んだというだけの理由、同等ではありませんでした世代収集領域のでHotSpotのガベージコレクタが、このメモリの一部として、Javaヒープの管理などとすることができる、方法、又は唯一の永久世代領域を達成するための方法にも及ぶメソッド領域に特に書かれたワークメモリ管理コードを省略することができます。永久的な概念の代わりに他の仮想マシン(例えば、BEA JRockitの、IBM J9、など)のために存在していません。原則的には、面積が制約せずに仮想マシンの詳細を実装する方法方法、仮想マシンの仕様に属しているが、恒久的な方法の面積を達成するための世代は、それがメモリオーバーフローの問題になりやすいですので、今、良いアイデアではないようだが、非常にありますこのような理由にはいくつかの方法が(String.intern())は、異なる仮想マシンで異なる症状があります。そのため、ロードマップが発表公式情報によると、HotSpot仮想マシンのために、今、彼らは永久的な世代を放棄し、徐々に地区計画法のネイティブメモリの使用を実装するために変更する必要があり、ホットスポットは今JDK1.7をリリースしました、彼は元に置かれてい恒久的な世代の文字列定数プールを除去しました。

加えて、Java仮想マシン仕様の制限領域は非常に緩いスタック方法、およびJavaヒープメモリを選択することができ、サイズやグループの戦いを固定することができますように、連続する必要はありません、また、ガベージコレクションを実装しないことを選択することができます。対照的に、この領域のガベージコレクションの動作が比較的小さい外観ではなく、単に同じ名前の永久世代としてエリアに入力されたデータの方法であり、この領域のメモリ回収、リサイクルし、反応器の型の定数プールの主な目的でありますアンロード、一般的には、面積が、条件が非常に厳しいことができ、荷降ろしの特に種類を比較的不満足な結果を回復したが、地域のこの部分の回復は確かに必要です。BUGの日のリストで、BUGは、深刻なメモリリークの数が存在していた原因と完全にこの領域に回収されない原因のHotSpot仮想マシンの低いバージョンにあります。

メモリ割り当て領域の方法は、需要を満たすことができないのJava仮想マシン仕様の規則によれば、OutOfMemoryErrorがスローされます。

定数プールのランタイム:

実行時定数プールは、ゾーン方式の一部です。クラス、フィールド、メソッド、およびインターフェース記述情報に加えて、クラス・ファイルのバージョン、ならびに定数プール情報、および様々なリテラルコンパイル生成された基準シンボルを格納するため、この部分では、クラスをロードしますストレージの時定数プールへの道に遭遇します。

各セクションのJava仮想マシンのヒープ・クラス・ファイル・フォーマット、そこに厳しい規制が各バイトは、認識ロードされ、実行される仮想マシンの要件を満たす必要があり、データを格納するために使用される、されているが、実行時定数プールは、Java仮想マシンの仕様は異なるプロバイダがこのメモリ領域を達成するために、自分のニーズに応じて仮想マシンを実装して、任意の詳細な要件がありません。しかし、一般的には、文書に引用して説明したクラスのシンボルを保存するだけで、それもまた、実行時定数プールに格納されて直接参照の外に変換します。

クラス定数プールへの実行時定数プールファイルの相対的なもう一つの重要な特徴は、必ずしもそれだけでは、ゾーン法を入力するには、クラスファイルの定数プールの内容を事前に設定されていない、生成するためにコンパイルJava言語は、一定の必要はありません、ダイナミック装備されていまた、多くの開発者の特徴であるプール、に新しい定数することができ、操作時に食べるように定数プールを実行すると、Stringクラスのメソッドとインターンにあります。

実行時定数プールエリアは、法の一部であるため、定数プールは、もはやOutOfMemmoryErrorメモリに適用することはできません自然に制限されたプログラム・メモリは、例外がスローされます。

ダイレクトメモリ:

ダイレクトメモリが動作している仮想マシンのデータ領域の一部ではない、またそれは仕様で定義されたJava仮想マシンのメモリ領域です。しかし、このメモリはまた、頻繁に使用されるが、また、OutOfMemoryErrorの例外につながる可能性があり、私たちは説明するために一緒に入れました。

JDK1.4 NIO新たに追加されたカテゴリに、I / Oモードでのバッファ(バッファ)を有するチャネルの導入に基づいて、割り当てられたヒープメモリの外部に直接ネイティブライブラリを使用することができ、その後、スタックを介して、Javaで格納されていますこのメモリの動作を基準としてDirectByteBufferオブジェクトは、これはかなりそれは、ヒープとヒープのJavaネイティブに複製データを回避し、いくつかの例では、パフォーマンスを向上させることができます。

それはメモリは間違いなく、まだマシンが総メモリ(RAMおよびスワップ領域またはページングファイル)サイズとプロセッサのアドレス空間の制限を含めるとなりますですので、明らかに、ダイレクトメモリ割り当てネイティブJavaヒープサイズは、しかし、限定されるものではなく、 。多くの場合、サーバ管理者の仮想マシンの構成のような実際のメモリ-Xmx設定パラメータ情報に基づいてパラメータが、各メモリ領域は物理メモリの制限の合計よりも大きくなるように直接メモリを見落としたとき。そして、OutOfMemoryErrorがスローされます。

 

おすすめ

転載: www.cnblogs.com/godoforange/p/11521388.html