1: Javaテクノロジーシステムモジュール図
2: JVMメモリ領域モデル
1.メソッド領域
は、「永続世代」および「非ヒープ」とも呼ばれ、仮想マシンによってロードされるクラス情報、定数、および静的変数を格納するために使用されます。各スレッドで共有されるメモリ領域です実行時定数プール: クラスのバージョン、フィールド、メソッド、インターフェイスなどの記述情報に加えて、クラス ファイルには、保存するために使用される定数プールもあります。コンパイラによって生成されるさまざまな情報。クラスのロード後にメソッド領域の実行時定数プールに配置されます。。デフォルトの最小値は 16MB、最大値は 64MB です。 -XX:PermSize および -XX:MaxPermSize パラメーターを使用して、メソッド領域のサイズを制限できます。
2. 仮想マシンスタック
は、Javaメソッド実行のメモリモデルを説明します:各メソッドが実行されると、ローカル変数テーブル(パラメータを含む)を格納するために「スタックフレーム」が作成されます。操作スタック、メソッド出口、その他の情報。各メソッドの呼び出しから実行完了までの過程は、仮想マシンスタックにおいてスタックフレームがスタックにプッシュされてからスタックからポップアウトされるまでの過程に相当する。宣言サイクルはスレッドと同じであり、スレッドに対してプライベートですローカル変数テーブルには、コンパイラーに認識されるさまざまな基本データ型 (boolean、byte、char、short、int、float、long、double) とオブジェクト参照 (オブジェクト自体ではなく参照ポインター) が格納されます。そのうち 64 個は、 bits Long 型および double 型のデータは 2 つのローカル変数のスペースを占有しますが、その他のデータ型は 1 つのスペースのみを占有します。ローカル変数テーブルに必要なメモリ空間は、メソッドの入力時に、スタック フレームに割り当てる必要があるローカル変数のサイズが完全に決定されます。スタック フレームのサイズは変更されません。実行時空間の変数テーブル。。
3. ローカル メソッド スタック
は、基本的に仮想マシン スタックと似ていますが、違いは、仮想マシン スタックが仮想マシンによって実行される Java メソッドを提供するのに対し、ローカル メソッド スタックはネイティブ メソッドを提供することです。方法。
4. Java ヒープおよび GC ヒープとも呼ばれるヒープ
新しい世代は、Eden Space と同じサイズの 2 つの Survivor Space (通常は S0 とも呼ばれます) から構成されます。と S1、または From と To)、-Xmn パラメーターを使用して新しい世代のサイズを指定できます。また、-XX:SurvivorRation を使用して Eden スペースと Survivor スペースのサイズを調整することもできます。は、JVM が実行されるときに各スレッドによって共有されるメモリ領域です。いつから作成され始めました。このメモリ領域には、オブジェクト インスタンスと配列 (すべて新しいオブジェクト) が格納されます。 サイズは、-Xms (最小値) および -Xmx (最大値) パラメーターによって設定されます。 -Xms は、JVM の起動時に要求される最小メモリです。 デフォルトは、オペレーティング システムの物理メモリの 1/64 です。 -Xmx は、JVM が適用できる最大メモリです。デフォルトでは、空きヒープ メモリが 40% 未満の場合、物理メモリの 1/4 です。の場合、JVM はヒープを -Xmx で指定されたサイズに増加します。 -XX:MinHeapFreeRation= を渡してこの比率を指定すると、空きヒープ メモリが 70% を超えると、JVM はヒープ サイズをそのサイズに削減します。この比率は XX:MaxHeapFreeRation= で指定できます。実行中のシステムでは、実行時にヒープ サイズが頻繁に調整されることを避けるために、-Xms と -Xmx の値は次のようになります。通常は同じ に設定されます。 コレクターは世代別コレクションアルゴリズムを使用するようになったため、ヒープは新しい世代と古い世代に分割されます。新しい世代には主に、新しく作成されたオブジェクトとまだ古い世代に入っていないオブジェクトが格納されます。古い世代には、複数のマイナー GC を生き延びたオブジェクトが保存されます。
新世代:
古い世代:
は、新しく作成されたオブジェクトなどの、複数の新しい世代の GC 後も存続するオブジェクトを格納するために使用されます。古い世代への移行には、主に 2 つの状況があります: ① 大きなオブジェクトは、起動パラメータ -XX:PretenureSizeThreshold=1024 (単位はバイト、デフォルトは 0) で設定でき、サイズを超えると割り当てられないことを示します。新しい世代ではなく、古い世代でも直接年が割り当てられます。 ②. 大きな配列オブジェクトの場合、配列内で参照される外部オブジェクトはありません。
旧世代が占有するメモリサイズは、-Xmxに相当する値から-Xmnに相当する値を引いた値となります。
5. プログラムカウンター
の機能は、仮想マシンモデルで実行されるバイトコードの行番号インジケーターです。バイトコード インタプリタは、このカウンタの値を変更して、次に実行するバイトコード命令を選択することによって機能します。分岐、ループ、例外処理、スレッド回復などの基本機能はすべてカウンタに依存します。
3: ダイレクトメモリ
ダイレクトメモリは仮想マシンメモリの一部ではなく、Java 仮想マシン仕様で定義されているメモリ領域でもありません。 jdk1.4 で新しく追加された NIO は、チャネルとバッファーの IO メソッドを導入し、ネイティブ メソッドを呼び出してオフヒープ メモリを直接割り当てることができます。このオフヒープ メモリはローカル メモリであり、ヒープ メモリのサイズには影響しません。 。上記は Java 仮想マシン学習 - アーキテクチャとメモリ モデルの内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。