1. ホーム

[解決済み】javaのメモリプールはどのように分割されるのですか?

2022-04-02 06:02:29

質問

現在、jconsoleでJavaアプリケーションを監視しています。メモリタブで、次のいずれかを選択できます。

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

この2つの違いは何ですか?

解決方法は?

ヒープメモリ

ヒープメモリは、Java VMがすべてのクラスインスタンスと配列のためのメモリを割り当てるランタイムデータ領域である。ヒープメモリは、固定サイズまたは可変サイズである。ガベージコレクタは、オブジェクトのためにヒープメモリを回収する自動メモリ管理システムです。

  • エデンスペース : ほとんどのオブジェクトで、最初にメモリが割り当てられるプール。

  • サバイバースペース : エデン空間のガベージコレクションを生き抜いたオブジェクトを含むプール。

  • テニュア世代 または オールドジェン : 生存者空間内に以前から存在するオブジェクトを含むプール。

ノンヒープメモリ

ノンヒープメモリには、すべてのスレッドで共有されるメソッド領域と、Java VMの内部処理または最適化に必要なメモリが含まれます。これは、ランタイム定数プール、フィールドとメソッドデータ、メソッドとコンストラクタのコードのようなクラスごとの構造を格納します。メソッド領域は論理的にはヒープの一部であるが,実装によっては,Java VMはガベージコレクションやコンパクト化を行わないこともある。ヒープメモリと同様に、メソッド領域は固定サイズまたは可変サイズである可能性があります。メソッド領域のメモリは、連続である必要はありません。

  • 永久保存版 : クラスやメソッドオブジェクトなど、仮想マシン自体のすべての反射データを含むプール。クラスデータの共有を使用するJava VMでは、この世代は読み取り専用と読み取り/書き込みの領域に分けられる。

  • コードキャッシュ : HotSpotのJava VMにはコードキャッシュも含まれており、ネイティブコードのコンパイルと保存に使用されるメモリが含まれています。

Jconsoleの使い方についてのドキュメントです。 .