Javaメモリプロファイリングについて学習している間、「ヒープ」に加えて「パーマ空間」という用語を見続けます。ヒープが何であるかを知っています。
永続的な世代 の略です:
パーマネント世代は、ユーザークラス(Java言語)の一部ではないクラス)を記述するメタデータを保持するため、特別です。このようなメタデータの例は、クラスとメソッドを記述するオブジェクトであり、永続的な世代に保存されます。大きなコードベースを持つアプリケーションは、ヒープのこのセグメントをすぐにいっぱいにして、
Java.lang.OutOfMemoryError
:PermGenは、-Xmxがどれだけ高くても、マシンにどれだけのメモリがあるかには関係ありません。
Perm space
は、ロードされたクラスと、通常String.intern()
メソッドによって作成されるString Pool
(高度に最適化された文字列の等価性テスト)などのいくつかの高度な機能の情報を保持するために使用されますアプリケーション(クラスの数)が大きくなると、このスペースのガベージコレクションは必要に応じてクリーンアップするのにあまり効果的ではないため、このスペースはすぐにいっぱいになります。その後、巨大な空のJVMがあったとしても、そのマシンでアプリケーションを効果的に実行してはなりません。
アプリケーションを開始する前に、Java -XX:MaxPermSize
を使用してこのエラーを取り除く必要があります。
単純な(そして単純化された)答え:データではなく、jvmが独自の簿記データを保存する場所です。
Perm Genは、クラスに関するメタデータ情報を保持する永続的な世代の略です。
Permgenスペースは、クラスやメソッドオブジェクトなど、仮想マシン自体のすべてのリフレクトデータを保持するヒープ領域です。
Permgenスペースは常にメソッドエリアと呼ばれます。クラスローダーサブシステムがクラスファイル(バイトコード)をメソッドエリア(permGen)にロードするとき。すべてのクラスメタデータが含まれます。たとえば、クラスの完全修飾名、直接の親クラスの完全修飾名、変数情報、コンストラクター情報、定数プール情報などです。
クラス定義、文字列プールなどを保持します。メタデータと呼ぶことができると思います。
PremGenの下にあるもの:Class AreaはPremGenエリアの下にあります。静的フィールドはクラスのロード時にも開発されるため、PremGenにも存在します。文字列のようにプールされるすべての不変のフィールドを持つコンスタントプールエリアは、ここに保持されます。それに加えて、クラスローダーによってロードされたクラスデータ、オブジェクト配列、jvmによって使用される内部オブジェクトも配置されます。
PermGen Spaceは、永続生成のためのメモリ割り当てを表します。すべてのJava不変オブジェクトは、リテラルまたはString.intern()
メソッドとString
のようにこのカテゴリに分類されます。 PermGen Spaceは、文字列の等価検索を高速化します。