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


88

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


13
Java 8はこの概念を完全に削除し、メタスペースに移行しました
pramodc84 2014

2
リファレンスは、ここにも説明しyoutube.com/watch?v=PUUJ4rNpRhU
SHAREEFを

回答:


103

それは永続的な世代の略です:

永続世代は、ユーザークラス(Java言語の一部ではないクラス)を記述するメタデータを保持するため、特別です。このようなメタデータの例は、クラスとメソッドを記述するオブジェクトであり、それらは永続世代に格納されます。コードベースが大きいアプリケーションは、ヒープのこのセグメントをすぐにいっぱいにする可能性があります。これによりjava.lang.OutOfMemoryError、-Xmxの高さやマシンのメモリ量に関係なく、PermGenが発生し ます。


アンドリュー、私はPerGenのサイズが何であるかについて知りたいだけですか?
gks 2017年

permgenは、ヒープメモリの一部である(この答えで述べたように)または( -この答えで述べたように、それはオフヒープの場合は興味があるだけstackoverflow.com/a/31103100/3061686)。
akki

25

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

アプリケーションを起動する前にjava -XX:MaxPermSize、このエラーを取り除く必要があります。


文字列のプールは、Java 7以降では、ヒープ領域にシフトします
カフェインコーダ

20

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


17

Perm Genは、クラスに関するメタデータ情報を保持する永続的な生成を表します。

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

5

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


3

クラス定義や文字列プールなどが含まれています。メタデータと呼べるかもしれません。


3

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


2

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


1

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


1
  • JVMにはJavaオブジェクトの内部表現があり、それらの内部表現はヒープに格納されます(若い世代または終身世代)。
  • JVMにはJavaクラスの内部表現もあり、それらは永続世代に格納されます

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.