web-dev-qa-db-ja.com

Javaでは、Permanent Generationスペースのガベージは収集されますか?

Perm gen(Permanent Generation)スペースはガベージコレクションされないことを読みました。ただし、CMSコレクションでは、一部のクラスがGCログでアンロードされているのを確認できます。では、perm genガベージはフルコレクションまたはCMSコレクションの間に収集されますか?

36
Ashish

PermGenは、ヒープの他の部分と同様にガベージコレクションされます。

ここで注意すべきことは、PermGenにはクラスとオブジェクトのメタデータ、つまりオブジェクトが割り当てられている残りのヒープへのポインタが含まれていることです。 PermGenには、使用終了時に手動で破棄する必要のあるクラスローダーも含まれています。そうでない場合、それらはメモリに残り、ヒープ上のオブジェクトへの参照を保持し続けます。 Sun/OracleブログサイトのJon Masamitsuによる "Permanent Generation"の提示) の記事が役立つ場合があります。

35
Sagar V

現在の世代のJVMでは、permgenは実際にはヒープの他の部分と同様に収集されます。 visualgc ページには、古い世代と一緒に収集されることが記載されています。

古いJVMでは、これは必ずしもそうではなかったようです。たとえば、Java 5 CMSコレクターどうやらでは、デフォルトでpermGenを収集しませんでした。-XX:+CMSPermGenSweepingEnabled。確かに古いJVMがpermgenコレクションをまったく実装していなかったと聞いたこともありますが、信頼できるソースは見つかりません... ermm ... "factoid"。

もう1つの点は、多くの人が誤って属性「OutOfMemoryError:permgen」の例外を持ち、permgenがまったく収集されないことです。現実は違います。これらのOOMEの最も一般的な原因は、実行中のJVMにコードをホットロードすると明らかになる、潜行性のある種類のストレージリークです。リークが発生するのは、置き換えられた古いクラスのインスタンスが到達可能なままであるためです。これにより、オブジェクトのクラスが到達可能になり、クラスクラスローダーが到達可能になります。これにより、古いクラスのallが、コードオブジェクト、文字列リテラル、および静的フレームとともに到達可能になりますと静的。これらのリークされたオブジェクトの多くはpermgenスペースにあります。


[〜#〜]更新[〜#〜]

Java 8以降、permgenは存在しなくなりました: JDK 8でのPermGenの除去

30
Stephen C