JVMのメモリ構造とメモリモデル

、JVMのメモリ構造

モジュール分解

1.プログラムカウンタ(スレッド・プライベート)

どのような(1)?

    プログラムカウンタは、行番号インジケータによって実行される現在のスレッドのバイトコードです。

(2)役割?

    ネイティブメソッドは、この計算の値を行えば、この計算を実行する必要の値を変更することにより、選択されたバイトコードインタプリタのバイトコード命令は、環状、ジャンプ、例外処理、スレッドが再開分岐しましたヌル

2. Java仮想マシンスタック(スレッド・プライベート)

どのような(1)であります

    Java仮想マシンのスタックのJavaメモリ・モデルを説明行う方法:各メソッドがスタックフレームを作成し、同時にプロセスからの各メソッドの実装実行を呼び出しを完了するまでは、仮想マシンのスタックにスタックフレームに対応スタックは、スタックを処理します。

(2)構成

①ローカル変数テーブル

    バイトコード命令のアドレスへのオブジェクト参照のタイプとRETURNADDRESSタイプの既知のコンパイルの基本的なタイプのストレージ(点。バイトコード命令つまりプログラムは、メソッド領域に格納され、その値は、ポインタ型RETURNADDRESS特定の命令のメモリアドレスでありますポインタ)

②オペランドスタック

    オペランドが最初にスタックの最後で、JVMオペコード、オペランドスタック上のすべてのデータであり、それぞれがメソッドを呼び出すため、動作、JVMは、計算に使用するスタックオペランドを生成します。

    例えば、= B + Cバイトコードオペランドスタック及びローカル変数テーブルの変更の実行中に、以下に示すように。

    3つのローカル変数a、bおよびc C、ローカル変数テーブルA、Bに格納され、それぞれ、第一のスタック

③ダイナミックリンク

    変換動作中に、それが動的リンクと呼ばれ、直接の参照です。一定の保持クラスバイトコードは、実行時参照が直接参照シンボル(すなわち、データポイント)になるだけで、シンボル参照を多く含む、または方法は、参照フィールドであってもよいです。

輸出用④

    すなわち、命令のアドレスの後に方法の次のステップである、方法が正常終了し、呼び出し元が異常終了は、リターンアドレスが例外ハンドラによって決定されるリターンアドレスとしてPCの値に対抗することができます。

3.ネイティブメソッドスタック(スレッド・プライベート)

どのような(1)?

    エリアのアドレスを入力するようにネイティブメソッドを保存

4. Javaヒープ(スレッドシェア)

どのような(1)?

    すべてのオブジェクトインスタンスおよびアレイはヒープ上に割り当てられます。メインエリアは、ガベージコレクタによって管理されています。

(2)パーティション

①新世代:エデンエリア、サバイバーゾーンから、サバイバー領域に
②歳

メソッド領域(スレッド株)

どのような(1)であります

    仮想マシンを格納するための方法のクラス情報エリアは、配布時にコンパイルされたコードは、クラスローディングの方法であって、定数、静的メンバ変数、JIT(タイムコンパイラ)データ、ロードされています。

(2)非ヒープ領域割り当て元として知られています

    空間メタデータ:メタデータ・クラス、メソッドデータ、メソッド情報(バイトコードは、スタック及び可変サイズ)、実行時定数プール、決定された基準シンボル等vtableのゾーン、ローカルメモリ領域に格納されています(外部メモリヒープ)

6.実行時定数プール(共有スレッド)

どのような(1)であります

    コンパイルおよび生成された基準を実行し格納するための様々な記号とリテラルの定数プールをランタイム。このセクションでは、クラスのロード時定数ストレージプール後の法領域に実行されます。この方法は、領域の一部であります

(2)及びリテラル符号

    。リテラル:文字列1; 2つのプリミティブ値; 3.final定数シンボリック参照:1.完全修飾クラス名及び方法; 2フィールド名と記述子、メソッドの3名。

二、JVMのメモリ・モデル

1.定義

    違いプラットフォームのメモリモデルには、異なるプラットフォームへの同時アクセスでエラーが発生することがあります。Javaのメモリモデル(Javaのメモリモデル、JMM)は同じ効果メモリアクセスを実現するために様々なプラットフォームでJavaプログラムを聞かせて達成するために、メモリアクセスにおけるハードウェアとオペレーティングシステムの違いのシールド品種です。

2.具体的な動作

    番組アクセスルールは、変数を定義する、すなわち、仮想マシン内の変数とメモリから削除下にある変数の詳細にメモリに格納されます。
    ここで、変数は、インスタンス・フィールド、静的フィールドとオブジェクトを構成する配列要素を意味し、この方法は、ローカル変数およびパラメータが含まれていません

3.メインメモリとワーキングメモリ

    JVMのメモリ・モデルは、すべての変数がメインメモリに格納されている必要があり、各スレッドは、独自のワーキングメモリを持っている、ワーキングメモリは、変数のスレッドが使用するメインメモリのコピーのコピーを保持しています。

4.同期、最終的に、揮発性

(1)同期

①相互に排他的

    スレッドが保持している監視対象の場合は、他のスレッドは待つことができます

②可視性

    後続のスレッドのスレッド同期コードブロック中保証書き込み動作は、コードブロックが表示されてなる(同じスレッドモニタオブジェクトを保持しています)。
    変数は、メインメモリから再ロードされるように、CPUになる他のスレッドは、コードブロックは、監視オブジェクトを取得する必要が入力し、キャッシュミス、現在のスレッドのリリースにオブジェクトを監視、メインメモリへのCPUのキャッシュ更新データの役割。

③禁止命令の並べ替え

(2)最終的な

①禁止命令の並べ替え
②可視性

    修正最後のフィールドの初期化に一度、コンストラクタに完了し、コンストラクタは「this」参照が(「this」参照のエスケープを通過しなかった非常に危険なことですが、他のスレッドがある「に初期化するために、この参照を介してアクセス可能オブジェクトの半分」)、その後、他のスレッドは、最後のフィールドの値を見ることができます。

(3)揮発性

①可視性
②禁止命令の並べ替え

例5

(1)リオーダリング

(2)可視

(3)相互に排他的

おすすめ

転載: juejin.im/post/5d62815bf265da03b638b7b1