PermGenは実際には何を表していますか?


122

PermGenとは何か、何に使用されるのか、なぜ失敗するのか、どのように増やすのかなどを知っています。

私が知らないのは、PermGenが実際に何を表しているのかです。永久…世代…何か?

誰かPermGenが実際に何を表しているのか知っていますか?


1
[良い説明] [1] GCの内部についてよく知っている人から。ちなみに、彼のブログには、GC関連の役立つ情報がたくさんあります。[1]:blogs.oracle.com/jonthecollector/entry/…–
Ivan

回答:


84

永久的な世代。詳細はもちろん実装固有です。

簡単に言うと、クラスとインターンされた文字列に関連付けられたJavaオブジェクトが含まれています。共有がオンになってclasses.jsaいるSunのクライアント実装では、メモリがマッピングされて初期データが形成され、約半分が読み取り専用で、半分がコピーオンライトです。

単に古いJavaオブジェクトはTenured Generationに保持されます。


19
「JDK 7では、インターン文字列はJavaヒープの永続的な世代に割り当てられなくなりました」:oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi

30
また、JDK 8では永続的な世代はまったくありません!この答えが何年にもわたって進化するのを見るのは楽しいです。
ブライアンゴードン

3
@BrianGordonは正解です。詳細については、stackoverflow.com
Fadi

59

PermGenは、ロードされたクラスを保持するためにJVMによって使用されます。あなたはそれを使ってそれを増やすことができます:

-XX:MaxPermSize=384m

Sun JVMまたはOpenJDKを使用している場合。

したがって、OutOfMemoryException:PermGenが発生した場合は、PermGenを大きくするか、クラスローダーに問題がある可能性があります。


6
このコメントを投稿したときに受け入れられた回答はどれですか。現在受け入れられている答え(これは "Tom Hawtin-タックライン"による)は私には正確に見えます。コメントを編集して、人々が現在受け入れられている回答を誤解しないようにするのは理にかなっていますか?
jbyler


8

元の質問と実際には関連していませんが、誰かが役立つと思うかもしれません。実際、PermGenは、Javaがクラスを保持するために使用していたメモリ内の領域です。したがって、たとえば多くのクラスがある場合、私たちの多くはPermGenでOOMに出くわしました。

Java 8以降、PermGen領域はMetaSpace領域に置き換えられました。より効率的で、デフォルトでは無制限です(またはより正確には、32または64ビットのJVMとOS仮想メモリの可用性に応じて、ネイティブメモリの量によって制限されます)。ただし、たとえば領域の最大制限を指定するなど、いくつかの方法で調整することが可能です。このブログ投稿で、より役立つ情報を見つけることができます。




3

私の記憶が正しければ、世代はガベージコレクターのように世代を表します(これは、若いオブジェクトを中年のオブジェクトや「永続的な」オブジェクトとは異なる方法で処理します)。局所性の原則は、最近作成されたオブジェクトが最初に消去されることを示唆しています。


1

Permgenは、Permanent Generationの略です。これは、JVMメモリー領域の1つです。これは、MaxPermSizeと呼ばれるフラグを使用することにより、固定サイズのヒープの一部です。

なぜ「PermGen」という名前なのですか?

このpermgenは、Javaの初期の頃に命名されました。Permgenメインは、ロードされたクラスのすべてのメタデータを保持します。しかし問題は、いったんクラスがロードされると、JVMがシャットダウンするまでそのクラスがJVMに残ることです。そのため、名前permgenがそれを選びます。しかし、後で、クラスの動的ロードが登場しましたが、名前は変更されませんでした。しかし、Java 8では、その問題にも対処しています。今permagenと改名されたメタスペース動的メモリサイズで。

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