web-dev-qa-db-ja.com

パーマスペースとは何ですか?

Javaメモリプロファイリングについて学習している間、「ヒープ」に加えて「パーマ空間」という用語を見続けます。ヒープが何であるかを知っています。

84
skiphoppy

永続的な世代 の略です:

パーマネント世代は、ユーザークラス(Java言語)の一部ではないクラス)を記述するメタデータを保持するため、特別です。このようなメタデータの例は、クラスとメソッドを記述するオブジェクトであり、永続的な世代に保存されます。大きなコードベースを持つアプリケーションは、ヒープのこのセグメントをすぐにいっぱいにして、Java.lang.OutOfMemoryError:PermGenは、-Xmxがどれだけ高くても、マシンにどれだけのメモリがあるかには関係ありません。

99
Andrew Hare

Perm spaceは、ロードされたクラスと、通常String.intern()メソッドによって作成されるString Pool(高度に最適化された文字列の等価性テスト)などのいくつかの高度な機能の情報を保持するために使用されますアプリケーション(クラスの数)が大きくなると、このスペースのガベージコレクションは必要に応じてクリーンアップするのにあまり効果的ではないため、このスペースはすぐにいっぱいになります。その後、巨大な空のJVMがあったとしても、そのマシンでアプリケーションを効果的に実行してはなりません。

アプリケーションを開始する前に、Java -XX:MaxPermSizeを使用してこのエラーを取り除く必要があります。

25
DKSRathore

単純な(そして単純化された)答え:データではなく、jvmが独自の簿記データを保存する場所です。

19
Matt

Perm Genは、クラスに関するメタデータ情報を保持する永続的な世代の略です。

  1. クラス名Aを作成すると、そのインスタンス変数がヒープメモリに格納され、クラスAが静的クラスローダーとともに永続的な世代に格納されるとします。
  2. ガベージコレクターは、永続的な世代のメモリに格納されているメモリ領域をクリアまたは解放するのが難しいことに気付くでしょう。したがって、permgenのメモリ設定を適切な制限に保つことを常にお勧めします。
  3. Java8にはメタスペース生成と呼ばれる概念が導入されているため、jdk 1.8バージョンを使用するときにpermgenは不要になりました。
17

Permgenスペースは、クラスやメソッドオブジェクトなど、仮想マシン自体のすべてのリフレクトデータを保持するヒープ領域です。

4
Jesse

Permgenスペースは常にメソッドエリアと呼ばれます。クラスローダーサブシステムがクラスファイル(バイトコード)をメソッドエリア(permGen)にロードするとき。すべてのクラスメタデータが含まれます。たとえば、クラスの完全修飾名、直接の親クラスの完全修飾名、変数情報、コンストラクター情報、定数プール情報などです。

3
Amruta

クラス定義、文字列プールなどを保持します。メタデータと呼ぶことができると思います。

2
Nick

PremGenの下にあるもの:Class AreaはPremGenエリアの下にあります。静的フィールドはクラスのロード時にも開発されるため、PremGenにも存在します。文字列のようにプールされるすべての不変のフィールドを持つコンスタントプールエリアは、ここに保持されます。それに加えて、クラスローダーによってロードされたクラスデータ、オブジェクト配列、jvmによって使用される内部オブジェクトも配置されます。

2
hi.nitish

PermGen Spaceは、永続生成のためのメモリ割り当てを表します。すべてのJava不変オブジェクトは、リテラルまたはString.intern()メソッドとStringのようにこのカテゴリに分類されます。 PermGen Spaceは、文字列の等価検索を高速化します。

1
Spark-Beginner