PermGenが何であるか、何のために使用されているのか、なぜ失敗するのか、PermGenを増やす方法などを知っています。
私が知らないのは、PermGenが実際に何を表しているのかということです。永久...ゲン...何か?
PermGenが実際に何を表しているのか誰もが知っていますか?
永久世代。詳細はもちろん実装固有です。
簡単に言うと、クラスとインターンされた文字列に関連付けられたJavaオブジェクトが含まれています。共有をオンにしたSunのクライアント実装では、classes.jsa
がメモリマップされ、初期データを形成します。読み取り専用とコピーオンライトの半分がコピーされます。
単に古いJavaオブジェクトはTenured Generationに保持されます。
PermGenは、ロードされたクラスを保持するためにJVMによって使用されます。あなたはそれを使って増やすことができます:
-XX:MaxPermSize=384m
sun JVMまたはOpenJDKを使用している場合。
したがって、OutOfMemoryException:PermGenが発生した場合、PermGenを大きくするか、クラスローダーに問題がある可能性があります。
永久世代。ガベージコレクタの詳細については、Java GCチューニングガイド を参照してください。
元の質問と実際に関連する一致ではありませんが、誰かが役に立つと思うかもしれません。実際、PermGenは、Javaがクラスを保持するために使用したメモリ内の領域です。そのため、たとえば多くのクラスがある場合、私たちの多くはPermGenでOOMに遭遇しました。
Java 8以降、PermGenエリアはMetaSpaceエリアに置き換えられました。これはより効率的で、デフォルトで無制限です(より正確には、32または64ビットjvmおよびOS仮想に応じてネイティブメモリの量によって制限されます)メモリの可用性)。ただし、たとえば領域の最大制限を指定するなど、いくつかの方法で調整することができます。 このブログ投稿 でより有用な情報を見つけることができます。
PermGenはPermanent Generationの略です。
ここに簡単な文句があります DDJ
私の記憶が正しければ、世代はガベージコレクターのように世代を表します(中年の「永続的な」オブジェクトとは異なる若いオブジェクトを処理します)。局所性の原理は、最近作成されたオブジェクトが最初に消去されることを示唆しています。
PermgenはPermanent Generationの略です。 JVMメモリ領域の1つです。 MaxPermSizeと呼ばれるフラグを使用して、サイズが固定されたヒープの一部です。
なぜ「PermGen」という名前ですか?
このpermgenは、Javaの初期に命名されました。 Permgenメインは、ロードされたクラスのすべてのメタデータを保持します。しかし問題は、クラスがロードされると、JVMがシャットダウンするまでJVMに残ることです。そのため、permgenという名前が最適です。しかし、その後、クラスの動的なロードが登場しましたが、名前は変更されていません。しかし、Java 8を使用すると、その問題にも対処できます。現在、permagenは、動的メモリサイズでMetaSpaceに名前が変更されました。