JavaとJVMのメモリ

1750 ワード

JVMとは?


Java仮想マシン、Java仮想マシンの略字に基づいて生成されたJavaプログラムの読み込み操作を実行します.

Javaプログラム実行プロセス

  • プログラムを実行すると、JVMはオペレーティングシステムからメモリ割り当て
  • を取得する.
  • Javaコンパイラによって作成されたJavaソース(.java)を読み込み、バイトコード(.class)に変換します.
  • 変換後のコードを説明します.
  • 解釈コード
  • はRuntime Data Area上で実行される

    Runtime Data Aare


    プログラムを実行するためにJavaプログラムを実行する場合、JVMがオペレーティングシステムから割り当てたメモリ領域は大きく5つの空間に分けることができます.

    単一スレッドの割当て


    PC Register


    -スレッドが開始されるたびに生成されるスペース
    -スレッドが実行するコマンドの一部を記録します.

    JVM Stacks


    -スレッドが開始されるたびに生成されるスペース
    -領域変数、パラメータ、戻り値および演算の一時値を格納する領域.

    Native Method Area


    -他のプログラミング言語で作成されるネイティブコードのメモリ領域

    スレッド共有領域


    Method Area


    -クラスメンバー変数の名前、データ型、アクセス制御者情報などのフィールド情報、メソッドの名前、戻りタイプ、パラメータ、アクセス制御者情報などのメソッド情報、タイプ情報(インタフェースかクラスか)、Constant Pool(定数プール:文字定数、タイプ、フィールド、オブジェクト参照が保存されている)、静的変数、final class変数などの生成領域.

    Heap


    -スレッド全体と共有するスペース
    -文字列をテキスト形式として宣言したときに作成されるString Pool領域があります.
    -実際のデータを持つインスタンスと配列を格納します.
    -Garbage Collectorメモリが参照されていない領域の特定と削除

    class Person {
        private int id;
        private String name;
    
        public Person(int id, String name) {
            this.id = id;
            this.name = name;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            int id = 1;
            String name = "whybe";
            Person person = null;
            person = buildPerson(id, name);
        }
    
        private static Person buildPerson(int id, String name) {
            return new Person(id, name);
        }
    }