Javaの:JVMのメモリモデル

JVMのメモリ・モデル

以下に示すように、JVMのメモリモデルは、二つの部分に分けることができ、ヒープおよびメソッド領域は、すべてのスレッドで共有され、仮想マシンのスタックは、プログラムカウンタスタックとローカルメソッドは、スレッドに対してプライベートです。
 

1.ヒープ(ヒープ)

古いや若い世代の:ヒープメモリは、すべてのスレッドが2つの部分に分けることができるで共有されています。図は、パーマの永久世代の代表であるが、ノートでは、ヒープメモリの永久世代の一部ではなく、jdk1.8置換後も永続的に除去します。
ヒープは、オブジェクト・インスタンスと(ヒープではなく、すべてのオブジェクト・インスタンス)の配列を格納するメモリの最大面積ではなく、共有メモリ領域の種々のスレッドによって管理されるJava仮想マシンのメモリ、メモリの領域です。その大きさ(最小値)と-Xmx(max)のパラメータ(最小値が最大値。1G未満である)、最小メモリの元アプリケーションによって-Xmsは、デフォルトでは後者の、オペレーティングシステムの物理メモリの1/64でありますこのMinHeapFreeRationを指定=:JVMは、既定のヒープメモリスペアが40%未満である場合、JVM -Xmxは-XXによって指定されたヒープメモリサイズを増大、1/4に最大メモリ、物理メモリのデフォルト値を適用することができます動作中にヒープのサイズを頻繁に調整を避けるために、当然のことながら、MaxHeapFreeRation =よりも、この列を指定:70%スペアヒープメモリ場合より大きいXXができ、JVMは、ヒープメモリサイズ-Xms指定されたサイズに縮小することができ、カラムより通常は同じに-Xms -Xmx値を提供します。ヒープメモリ= + +古い世代にわたる世代の新世代。我々ガベージコレクションは、我々は古い世代に記憶し、新世代ヒープ傾向にある場合には(サイズ比1:2)、および3の割合でエデンSurvivor0、Survivor1による新世代は8:1:1、新世代オブジェクトが生存に位置しているためにマイナーGCに複製アルゴリズムを使用して、回復メカニズムは、我々は生存の面積を滞在する必要があり、地域の本当の行為は、一定の年齢(デフォルト15よりも長く私たちのオブジェクトときは、することができエデン+サバイバルゾーンの一つであり、パラメータ設定)で、もちろん、大きなオブジェクトを直接旧世代の中に、古い世代内のオブジェクトを配置します。古い世代のコレクションアルゴリズムは、アルゴリズムを整理するためにタグを使用しています。

2.メソッド領域(方法エリア)

また、クラス情報、定数、静的変数をロードするために仮想マシンを格納するために使用される「永久世代」として知られている地区の方法は、各スレッドは、共有メモリ領域です。-XXによる16メガバイトのデフォルトの最小値、64メガバイトの最大値(ポインタ拡張、デフォルト85Mので、64ビットJVM):PermSizeをと-XX:MaxPermSizeをサイズパラメータ制限ゾーン方法。これは、連続したヒープ領域、恒久的な世代別ガベージコレクションで、一緒にバンドル(旧世代)歳なので、いっぱいですどんなには、古い時代のガベージコレクションと永久世代をトリガーします。しかし、明白な疑問は、JVMクラス情報によってロードされたときに、パラメータの容量を超えている-XX:MaxPermSizeの値セットは、アプリケーションがOOMエラーを報告します。-XXによってパラメータ:PermSizeをと-XX:MaxPermSizeを設定します。

3.仮想マシンのスタック(JVMスタック)

Javaメモリー・モデルは、実行される方法の説明である:実行される各方法は、(パラメータを含む)ローカル変数テーブルを格納するための、操作情報スタック、方法輸出を「スタックフレーム」を作成します。各方法は、プロシージャの実行を完了するために呼び出され、スタックフレームがスタックからプロセススタックのスタックに仮想マシンに対応します。同じスレッドでのライフサイクルは、スレッドはプライベートです。ローカル変数、オペランドスタック、フレームデータ領域:スタックフレームは、3つの部分から構成されています。ローカル変数は、ローカル変数とオペランドスタックは、ワード単位の配列に編成されるように、アレイは、ゼロからカウントを開始し、ワード幅として編成されます。しかし、前者との違いは、インデックスを介してアクセスできないということですが、スタックはスタックとアウトを介してアクセスされるデータの一時記憶領域として見ることができます。ローカル変数とオペランドスタックに加えて、Javaスタックフレームは、定数プール解像度、通常の方法に戻り、例外ディスパッチ機構をサポートするためにいくつかのデータを必要とします。これらのデータは、フレームのJavaスタックフレームのデータ領域に格納されています。
長いデータの二重の長さが64ビット空間であることを特徴とする請求コンパイラで知られている様々なタイプの基本的なデータを記憶し、オブジェクト参照(ポインタ参照ではなく、オブジェクト自体)、2つのローカル変数、残りのデータタイプ:ローカル変数テーブル一つだけ。メソッドを入力するときに、コンパイル時に割り当てられたローカル変数テーブルメモリ空間の完了のために必要な、この方法ははるかにローカル変数割当を必要とする操作時のスタックフレームのスタックフレームで完全に決定されたローカル変数テーブルのサイズを変更しませんスペース。

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

そして、スタックはサービスの方法を実行するために、Java仮想マシン、仮想マシン、およびローカルスタック方式であることを除いて、実質的に類似した仮想マシン・スタックは、ネイティブサービスするための方法です。(スタック空間は、ヒープのサイズよりもはるかに小さいです)

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

メモリ領域は、その役割は、行番号インジケータバイトコードは、現在、バイトコードインタプリタは、カウンタの値を変更することによって動作している仮想マシンのモデルは、次を選択するためにスレッドを実行して、最小でありますバイトコード命令、例外処理を実行するために必要性をループ、分岐、およびその他の基本的な機能のスレッドの回復はカウンター完全依存しています。

6.ダイレクトメモリ

ダイレクト・メモリは、仮想マシンのメモリの一部ではなく、また、メモリ領域のJava仮想マシン仕様で定義されました。JDK1.4新しく追加されたNIO、およびIOバッファモードチャネルの導入は、それが直接の方法は、ヒープネイティブ外のメモリを割り当て呼び出すことができ、外部メモリは、ネイティブヒープメモリである、それはヒープメモリのサイズには影響しません。
 

おすすめ

転載: www.cnblogs.com/itsharehome/p/11290907.html