[学習] 2.Java仮想マシンJVMランタイムデータ領域

出典:公開番号:猿バレー

ここでは、我々は最初はさておき、私たちは、多くの場合、インタビューの中で尋ねたと信じていたJavaメモリモデルで、私はしばしばインタビュー他人にこの質問をするでしょう。しかし、私は多くの場合、恥ずかしいようになります、私はまた、インタビュアーは、(... Java仮想マシンのヒープ、メソッド領域、仮想マシン・スタック、それをITである)の期間は、「暗唱」になるめったに音声だけでなく、心を推定します幸い、前誇らしげオンライン検索のGETIがあまりにも、よく準備されたかったのです。時はいつでもこの時は本当にスムーズにあまりにも「暗唱」ので、私は、分割する心を持っていません!

これは不思議インタビュー、Java仮想マシンのすべての知識の側面の第一、シニア猿のためのプログラム、ずっと何かポジティブJava仮想マシンと接触した作品ではありません。第二に、我々はJavaのメモリモデルを検索し、オンラインで、上に行くこの良いに従っている、最初のページには、あなたのお母さんの大程度であるJavaランタイムデータ領域を導入押して、恥ずかしさのある特定の誤解を招くような、資本を果たしました。

Benpianは、Javaランタイムデータ領域を構成する細部にあなたの小さなパートナーを与える、Javaのメモリモデルは、仮想マシン内の焦点である、背中には1を引かれ、個別に導入されます。

1.はじめにランタイムデータ領域

実行に必要なプログラムメモリ空間、いくつかは、コンパイル時に決定することができない、動的に実行時に実際の動作条件に基づいて、システム内に作成する必要があります。それは別のデータ領域の数を管理しますれているJavaプログラムの実行中のJava仮想マシンのメモリ部門。これらの領域は、独自の目的を持って、創造と破壊の時間は、仮想マシンプロセスと一緒にいくつかの領域が存在し、一部の地域間、スレッドを作成し、破壊し、開始と終了のユーザーに依存しています。

JVMランタイムデータ領域.PNG

示されるように、ヒープおよびメソッド領域は、公共エリア内のすべてのスレッドによって共有され、JVMメモリ空間によって占有ヒープおよびメソッド領域はホットスポットメモリ管理モジュールのメンテナンスによる領域内のメモリ割り当ての管理を担当して、ワーキングメモリは自動的にガベージコレクタによって解放されます。VMスタック、ネイティブメソッドスタックは、プログラムカウンタは、各スレッドは独自のスタックとプログラムカウンタに関連付けられている、とだけスタック領域プログラムと計算の独自のシェアを使用してプログラムを実行するために、スレッドのプライベートエリアです。

2.ヒープ(ヒープ)

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

Javaヒープ容量が固定または動的にプログラム実行のための需要が拡大し、自動的にあまりにも多くのスペースを必要としないときに収縮することができます。Javaスタックは限り論理的に連続することができて、不連続な物理メモリ空間であってもよいです。そこにヒープメモリの割り当てには完全な例ではありません、そしてスタックはもはや広げることができない場合は、OutOfMemoryErrorがスローされます。

Javaヒープは、ガベージコレクタによって管理されるメインエリアであるため、多くの場合も、「GCヒープ」(ヒープをガベージコレクション)と呼ばれます集電体による視野のメモリリカバリポイントは、基本的に使用しているの観点から世代コレクションアルゴリズムを、Java仮想マシンのヒープは古いものと新しい世代のに分かれています。ここで、新世代領域は、エデンに分割し、2つのサバイバー領域(サバイバーから、サバイバーに)同じ大きされています。生成対象の速度、およびサバイバー領域の使用、及び動的エデン領域サバイバー領域の割合を調整することによれば、デフォルトでは、撮影したJava仮想マシンは、動的割り当て方式(+ UsePSAdaptiveSurvivorSizePolicy JVMパラメータ-XX)です。この比率、パラメータ(SurvivorRatio)によって調整することができるSurvivorRatioはサバイバー= 8:1:このパラメータは、デフォルトはエデンの図8に示すように、代表的な新世代領域の容量とサバイバーエデン領域の比率です。

JVMのヒープ世代.PNG

それは事故のいくつかのメモリを共有する2つのオブジェクトが存在することは可能ですか?

ときに新しいコール命令、除算はエデンでオブジェクトを格納するメモリとなります。ヒープ空間がスレッドによって共有されているので、空間が指定されている直接場合、こうして側がする必要が同期ことがあります。それ以外の場合は、2つの共有メモリオブジェクトが表示され、いくつかの事故のために可能になります。解決策は、Javaヒープは、専用のバッファ割り当てに複数のスレッドを引き出すことができるTLAB(対応する仮想マシンのパラメータ、スレッドローカル割り当てバッファを-XX:デフォルトで有効になって+ UseTLAB、)。

具体的には、各スレッドは、スレッドプライベートTLABとして、そのような2048バイトなど、連続したメモリ用のJava仮想マシンに適用することができます。(それはおそらくより実際には、しかし、2つの重要な)TLABの終わりにTLAB空きメモリ、およびポイントで開始位置を指し、この操作では、ロックを必要とし、スレッドは二つのポインタを維持する必要があります。次の新たな命令ポインタ加算器は、直接(ポインタバンプ)には、ポインタの衝突、すなわち、スペアメモリ位置ポインタポイントプラス要求されたバイトの数を達成するために知られていたができます。空きメモリの添加後のポインタの値がまだ終了未満またはポインタ点に等しい場合には、割り当てが成功表します。それ以外の場合は、TLABは、この新しい操作を満たすために十分なスペースがありませんでした。この時間は、現在のスレッドが新しいTLABに再適用する必要があります。

前記領域の方法(方法エリア)

この方法は、仮想マシンがパワーオンされたときに作成、スレッドのスタック領域と同じで共有され、メソッド領域は、ヒープの論理的な部分とみなすことができるが、それは非ヒープ(非ヒープ)という別名を持ち、その目的は、Javaヒープにあるべきです独立しました。

この方法は、各クラスの構成情報を格納する従来のコンパイラ、後にエリアコード記憶領域に類似している、など。

  • 定数プール
  • ドメイン
  • メソッドデータ
  • バイトコードのメソッドとコンストラクタの
  • インターフェースの特別な初期化に使用されるクラス、インスタンス、メソッド

:カテゴリ情報の「Java仮想マシンの深い理解を」、仮想マシンがロードされている定数、静的変数を格納するために要約され、タイムコンパイラは、コードやその他のデータメソッド領域をコンパイルします。

加えて、この方法は非常にリラックスしたエリア上のJava仮想マシン仕様の制限、およびJavaヒープメモリを選択し、サイズを固定することができますように、連続する必要はありませんか、拡張することができるが、また、ガベージコレクションを実装しないことを選択することができます。ガベージコレクションの対象このエリアには、一定のプールタイプのリサイクルとアンロードのために主にあります。

4.プログラムカウンタ(プログラムカウンタレジスタ)

Java仮想マシンが複数の実行スレッドをサポートすることができ、各スレッドは、独自のJava仮想マシンのプログラムカウンタを持っています。任意の時点で、Java仮想マシンのスレッドがメソッドのコードを実行する、この方法は、このスレッド(現在methon)の現在のスレッドの実行法と呼ばれています。このメソッドがネイティブでない場合は、プログラムカウンタを保存したアドレスバイトコード命令は、Java仮想マシンが実行されています。メソッドがネイティブメソッドである場合、プログラムカウンタ値がnull(不定)。プログラムカウンタ記憶容量は、少なくともデータ型RETURNADDRESSの値またはローカルプラットフォームに関連付けられたポインタであるべきです。

プログラムカウンタは、現在の実行スレッドのインジケータバイトコードの行番号と見なすことができ、より小さなメモリ空間です。このメモリ領域は、地域のOutOfMemoryError Java仮想マシン仕様でどのような状況のために用意されていませ唯一のものです。

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

各Java仮想マシンのスレッドは、独自のプライベートのJava仮想マシン・スタック、そのライフサイクルと同じスレッドを持っています。:仮想マシンのスタックのJavaメモリ・モデルは、記載された方法が行われるローカル変数テーブルの情報記憶を実行している間(フレームスタック)各メソッドは、スタックフレームを作成し、オペランドスタック、動的リンクなど輸出用実行手順が完了するまで、各メソッドは、呼び出された仮想マシンプロセススタック内のスタックにプッシュと対応するスタックフレーム。

Java仮想マシンは、次の例外が発生する可能性がありますスタック:

  • スレッドスタックの割り当て要求が最大のJava仮想マシンのスタック許可容量の容量を超えた場合は、Java仮想マシンがスローされますにStackOverflowError例外を。
  • Java仮想マシンのスタックを動的に拡張することができ、適用できない場合、それは十分なメモリを持っている時間を延長しようとし、または対応する仮想マシンのスタックを作成するための新しいスレッドを作成するときに十分なメモリ領域が存在しない、それは、Java仮想マシンがスローされますOutOfMemoryErrorが異常

6. Aネイティブメソッドスタック(ネイティブメソッドスタック)

ネイティブメソッドスタックと仮想マシンの役割は非常に似ていますが、それらの間の差は、仮想マシンの実行スタックへの仮想マシンであるスタックJavaメソッド(つまり、バイトコード)サービス、およびローカルスタック方法は、仮想マシンを使用していましたネイティブメソッドサービス。

Java仮想マシン仕様は、固定サイズとして実装され、または拡張し、に従い、契約動的に計算されたネイティブメソッドスタックすることができます。固定サイズのネイティブメソッドスタックの場合、スタックを作成する場合、次にネイティブメソッドスタック容量のすべてのスレッドは、独立して選択することができます。

仮想マシンのスタックのように、スタック領域のネイティブ方法は、またにStackOverflowErrorとのOutOfMemoryErrorを投げることができます。

7.拡張知識

スタック上の7.1分布とエスケープ解析

基本的な考え方は、そうスタックに割り当てられているローカル変数のスコープの分析は、内部メソッド、オブジェクト空間に直接割り当てられたJVMスタックフレームに制限され、ヒープを割り当て避けます。この分析が呼び出されたエスケープ解析(とも呼ばれる進化解析)、スタックフレームの割り当てが呼び出され、スタック上に割り当てられました

目的は、新世代の収集の数を削減し、間接的にJVMのパフォーマンスを改善することです。仮想マシンは、SunのJava 6u23、デフォルトで有効になっHotSpotのエスケープ分析から分析スタックスイッチ構成を逃がすことができます。

7.2スタックフレーム

スタックフレームは、仮想マシンのスタックのスタック要素の仮想マシンの実行時データ領域であるメソッド呼び出しを実行するための仮想マシンのデータ構造および方法をサポートするために使用されます。ローカル変数スタックフレーム法、オペランドスタック、およびダイナミックリンクリターンアドレスおよび他の情報のための方法を格納します開始から実行終了まで各メソッド呼び出しプロセスは、スタックフレームは、内部仮想マシンでスタックからスタックにプッシュする処理に相当します。

コンパイラのコードは、スタックフレームがずっとローカル変数テーブルを必要とする場合、どのように深いオペランドスタックは完全に決定され、メソッドテーブル内のコード属性に書き込まれています。あまりにも多くのメモリを割り当てる必要がどのようにスタックフレームは、プログラムの実行変数データの影響を受けませんが、唯一の特定の仮想マシンの実装に依存します。

チェーン方法は、スレッドが長くなる可能性が呼び出して、多くの方法が同時に実行されています。実行エンジンのために、アクティブなスレッドでは、スタック・スタック・フレームの上部のみが有効であり、それは(現在のスタックフレーム)現在のスタックフレームと呼ばれ、スタックフレームに関連付けられている方法は、現在のメソッドを呼び出した(現在の方法) 。すべてのバイトコード命令の実行エンジンは、現在のスタックフレームのために運営されています。概念構造のスタックフレームは次のとおりです。
スタックフレームの概念構造.PNG

図8の脳ランタイムデータ領域

実行時データ領域.PNG

HDは、何のコード、完全なマインドマップは、プライベートの手紙やああを通知するメッセージになることはできません!

おすすめ

転載: www.cnblogs.com/alterem/p/11567111.html