2

起動時に 2 つまたは 3 つのフル GC を実行するアプリケーションがあります。多くのヒープ領域があり、GC (マイナーまたはフル) を実行する必要はありません。ただし、gc ログでは、permgen がいっぱいになり、その直後に完全な GC が実行されていることがわかります。この後、permgen スペースが増加します。最終的に、すべてのクラスがロードされると、完全な GC はなくなります。

私の質問は、permgen がいっぱいになった場合、VM は GC を実行してヒープからメモリを要求し、余分なメモリを permgen に追加しますか? それとも OutOfMemory-permgen をスローしますか?

4

2 に答える 2

3

私の質問は、permgen がいっぱいになった場合、VM は GC を実行してヒープからメモリを要求し、余分なメモリを permgen に追加しますか? それとも OutOfMemory-permgen をスローしますか?

GC は、permgen スペースのメモリを解放するためにフル GC を実行します。それでも十分なスペースを解放できない場合、permgen がいっぱいであることを示す OOME がスローされます。

現在または過去の HotSpot JVM は、これを許可する通常のヒープ領域があるかどうかにかかわらず、permgen を所定の制限を超えて増加させようとしません。


OOME (permgen) の前にフル GC を実行する必要がある理由は次のとおりです。

  • 非 permgen 空間で permgen オブジェクトへの参照があった可能性があります。フル GC を実行すると、これがチェックされます。
  • (AFAIK)permgenをGCすることは、通常、とにかく完全なGCに関連付けられています...おそらく同じ理由で。permgen オブジェクトを到達可能に保つのは通常、通常のヒープと GC の「ルート」からの参照です。

通常、Permgen オブジェクトは (AFAIK) 不変であるため、permgen オブジェクトの突然変異による到達可能性の変化はほとんどありません。

于 2013-04-09T05:36:22.143 に答える
0

PermGen のサイズが -XX:MaxPermGen 制限 (またはデフォルト) に達すると、OOM-permgen がスローされます。

于 2013-04-09T04:59:25.083 に答える