仮想マシンの読み取りメモ-ランタイムデータ領域の詳細な理解

ランタイムデータ領域

  • プログラムカウンタ(PCレジスタ)
    • スレッドはプライベートであり、スペースは小さいです。これは、現在のスレッドによって実行されたバイトコードの行番号インジケータです
    • バイトコードインタープリターが機能している場合、次のバイトコード命令は、カウンターの値を変更することによって取得されます。
    • 分岐、ループ、ジャンプ、例外処理、スレッド回復などの操作への依存。
    • Javaメソッド:現在のバイトコード命令のアドレス。
    • Nativeメソッドが空です。
    • OutOfMemoryErrorがない唯一のメモリ領域
  • Java仮想マシンスタック
    • スレッドはプライベートであり、Javaメソッドが実行されるときのメモリモデルを記述します
    • メソッドが実行されると、スタックフレームが作成され、スタックにプッシュされます。
    • スタックフレーム:ローカル変数テーブル、オペランドスタック、ダイナミックリンク、メソッドの入り口と出口などを格納するために使用されます。
      • ローカル変数テーブル
        • コンパイル時に既知のデータを保存します。メモリ空間はコンパイル時に完全に決定され、操作中に変更されません
        • さまざまな基本データ型、64ビット長、ダブルスタック、2つのローカル変数スペース(スロット)、残りの1つ
        • オブジェクト参照(参照タイプ、オブジェクトのアドレスへの直接ポインター、またはオブジェクトへのハンドル)
        • returnAddressタイプ(バイトコード命令のアドレスを指す)
    • 異常な状況
      • スレッドによって要求されたスタックの深さが仮想マシンの実行中の深さよりも大きく、StackOverflowErrorがスローされます
      • 仮想マシンスタックが動的に実行される場合、拡張が十分なメモリの適用に失敗すると、OutOfMemoryErrorがスローされます
  • ネイティブメソッドスタック
    • 仮想マシンスタックに似ていますが、ネイティブメソッドを提供します
    • 例外は仮想マシンスタックと同じです
    • 仮想マシン仕様は、この領域で使用される言語、メソッド、およびデータ構造を義務付けておらず、自由に実装できます
  • Javaヒープ
    • 仮想マシンの起動時に作成され、オブジェクトインスタンスを格納するために使用される最大のスペース、スレッド共有
    • メモリ空間が物理的に不連続です
    • Java仮想マシン仕様:すべてのオブジェクトインスタンスと配列をヒープに割り当てる必要があります
    • 動的に拡張できない場合、OutOfMemoryErrorをスローします
    • メモリパーティション
      • 若い:古いデフォルトは1:2
      • 若い世代
        • エデン:サバイバー= 8:1
        • エデンエリアと2人のサバイバーがあります
        • エデン
          • 新しく作成されたオブジェクトが保存され、部品がなくなると、若いgc(マイナーgc)が実行されます。
        • サバイバー
          • 若いgcのたびに、edenで生き残ったオブジェクトと別のSurvivorのオブジェクトが現在のサーバーに分類され、ストレージ自体のストレージスペースの継続性と他のスペースのアイドル状態が保証されます。
      • 老齢
        • デフォルトでは、マイナーGCを15回通過したSurvivorのオブジェクトが保存されます
        • または、マイナーGC、サバイバーのメモリが不十分な場合、古い世代を使用して割り当てを保証し、オブジェクトをこの領域に直接転送します。
        • または、オブジェクトが特定のサイズより大きい場合、古い世代に直接割り当てられます
  • メソッドエリア
    • スレッド共有。ロードされた定数、静的変数、ジャストインタイムコンパイラーによってコンパイルされたコードなどを格納するために使用されます。
    • スレッドセーフ。クラスが読み込まれると、特定のクラス情報をメソッド領域に読み込むことができるスレッドは1つだけです。
    • 永続的な生成(1.8以降削除):Hotspotは、GC生成コレクションをメソッド領域に拡張して、ヒープのようなメモリ管理を容易にします
    • メモリ割り当て要件を満たせない場合、OutOfMemoryErrorがスローされます
    • ランタイム定数プール
      • クラスファイルは、コンパイル中に生成されたリテラルとシンボル参照を格納し、クラスのロード後にこの領域に格納されます。
      • 翻訳された直接参照も保存します
      • 動的:操作中に新しい可変ゾーンを実行できます
      • メモリ割り当て要件を満たせない場合、OutOfMemoryErrorがスローされます
  • 直接記憶
    • 仮想マシン仕様で定義されていないオフヒープメモリ、仮想マシン自体によって制限されていない
    • ガベージコレクション管理なし
    • 1.4チャネルおよびバッファバッファのIOメソッドに基づいて導入されたNIOクラスは、ネイティブ関数を使用してオフヒープメモリを直接割り当てます
    • このメモリへの参照として、JavaでDirectByteBufferオブジェクトを操作します。
    • パラメータでサイズを指定します。デフォルトはヒープの最大値と同じです
    • メモリ割り当て時にメモリオーバーフローが発生した場合、メモリ割り当てを申請するのではなく、メモリ不足を計算して手動で例外をスローする
  • メタスペース
    • ロードされたクラス情報を保存する
    • メタデータ領域は永続的な世代を置き換えます。本質は永続的な世代のそれと似ています。それらはすべてJVM仕様のメソッド領域を実装します。違いは、メタデータ領域が仮想マシン内になく、ローカルメモリを使用することです。メタデータ領域は頻繁に使用され、OutOfMemory例外も発生する可能性があります。
    • メタデータ領域の動的拡張、デフォルト-XX:MetaspaceSizeは21MBの最高水位標です。触れると、フルGCがトリガーされ、未使用のクラスがアンロードされ(クラスに対応するクラスローダーが無効になります)、最高水位標がリセットされます。新しい最高水準点の値は、GCの後に解放されたメタスペースによって異なります。解放されたスペースがほとんどない場合、この最高水位標は上昇します。空き領域が多すぎると、最高水準点が下がります。
元の記事を24件公開 賞賛0件 訪問数107件

おすすめ

転載: blog.csdn.net/jiangxiayouyu/article/details/105606948