Java仮想マシンランタイムデータ領域


文書ディレクトリ
  • 1.ランタイムデータ領域
  • 1.1プログラムカウンタ
  • 1.2 Java仮想マシンスタック
  • 1.3ローカルメソッドスタック
  • 1.4ヒープ
  • 1.5メソッド領域
  • 1.6運転時定数プール
  • 1.7ダイレクトメモリ
  • Java仮想マシン
    1.運転時データ領域
    1.1プログラムカウンタ
    実行中の仮想マシンバイトコード命令のアドレスを記録します(ローカルメソッドが実行されている場合は空).
    1.2 Java仮想マシンスタック
    各Javaメソッドは、実行と同時に、ローカル変数テーブル、オペランドスタック、定数プール参照などの情報を格納するスタックフレームを作成します.メソッド呼び出しから実行が完了するまでのプロセスは、Java仮想マシンスタックにスタックフレームをインスタックおよびアウトスタックするプロセスに対応します.
    各スレッドのJava仮想マシンスタックのメモリサイズは、-Xssという仮想マシンパラメータで指定できます.JDK 1.4では256 K、JDK 1.5+では1 Mです.
    java -Xss2M HackTheJava
    

    この領域では、次の例外が放出されます.
  • スレッド要求のスタック深さが最大値を超えると、StackOverflowError異常が放出される.
  • スタックを動的に拡張する場合、十分なメモリを申請できない場合は、OutOfMemoryError異常が放出されます.

  • 1.3ローカルメソッドスタック
    ローカルメソッドスタックはJava仮想マシンスタックと同様であり、ローカルメソッドスタックがローカルメソッドサービスであることの違いにすぎません.
    ローカルメソッドは、一般に他の言語(C、C++またはアセンブリ言語など)で記述され、これらのメソッドに対して特別な処理が必要なネイティブハードウェアおよびオペレーティングシステムに基づくプログラムとしてコンパイルされる.
    1.4山
    すべてのオブジェクトにメモリが割り当てられており、ゴミ収集のメインエリア(「GCスタック」)です.
    現代のごみ収集器は基本的に世代別収集アルゴリズムを採用しており、その主な思想は異なるタイプの対象に対して異なるごみ回収アルゴリズムを採用することである.スタックを2つに分割できます.
  • 新生代(Young Generation)
  • 旧世代(Old Generation)
  • スタックは連続メモリを必要とせず、メモリを動的に増加させることができ、増加に失敗するとOutOfMemoryError異常が放出されます.
    プログラムのスタックメモリサイズは、-Xmsと-Xmxの2つの仮想マシンパラメータで指定できます.最初のパラメータは初期値を設定し、2番目のパラメータは最大値を設定します.
    java -Xms1M -Xmx2M HackTheJava
    

    1.5メソッド領域
    ロードされたクラス情報、定数、静的変数、インスタントコンパイラでコンパイルされたコードなどのデータを格納するために使用されます.
    スタックと同様に連続メモリを必要とせず、動的に拡張でき、動的拡張に失敗するとOutOfMemoryError異常が放出されます.
    この領域のごみ回収の主な目標は定数プールの回収とクラスのアンロードであるが,一般的には実現しにくい.
    HotSpot仮想マシンは、それを永続的な世代としてゴミ回収を行います.しかし、多くの要因の影響を受け、Full GC以降の世代の大きさが変化するたびにOutOfMemoryError異常が放出されるため、永続世代の大きさを決定することは困難である.メソッド領域の管理を容易にするために、JDK 1.8から永続世代を削除し、仮想マシンメモリではなくローカルメモリにあるメソッド領域をメタ空間に移動します.
    メソッド領域はJVM仕様であり、永続世代とメタ空間はその実装方法である.JDK 1.8以降,元の永久世代のデータはスタックとメタ空間に分割された.メタ空間記憶クラスのメタ情報,静的変数,定数プールなどをスタックに入れる.
    1.6経時プールの実行
    ランタイムプールはメソッド領域の一部です.
    Classファイルの定数プール(コンパイラによって生成された字面量とシンボル参照)は、クラスがロードされた後にこの領域に格納されます.
    コンパイル期間中に生成される定数に加えて、Stringクラスのintern()などの動的生成も可能です.
    1.7ダイレクトメモリ
    JDK 1.4には、Native関数ライブラリを使用してスタック外メモリを直接割り当て、Javaスタック内のDirectByteBufferオブジェクトをこのメモリの参照として操作できるNIOクラスが新たに導入されました.これにより、スタックメモリとスタック外メモリでのデータのコピーが回避されるため、いくつかのシーンでパフォーマンスが大幅に向上します.