web-dev-qa-db-ja.com

-XX:MaxPermSizeとは何ですか?

具体的には、なぜPermGen OutOfMemoryError問題を解決するのに役立つのでしょうか。

また、JVMの引数に関するドキュメントを参照してください答えのボーナスポイント...

231
Geoff

永続的なスペースとは、VMによって使用されるクラス、メソッド、内部化された文字列、および同様のオブジェクトが格納され、割り当て解除されることがない場所です(したがって名前)。

このOracle記事 HotSpot GCの動作とパラメータ化を簡潔に説明し、多数のクラスをロードする場合はこのスペースを増やすことをお勧めします(これは通常、アプリケーションサーバーやEclipseのようなIDEの場合です)。 :

常設世代は、ほとんどのアプリケーションでガベージコレクタのパフォーマンスに大きな影響を与えません。ただし、アプリケーションによっては、多数のクラスを動的に生成してロードするものがあります。たとえば、JavaServer Pages(JSP)ページの実装などです。これらのアプリケーションは、追加のクラスを保持するためにより大きな永続的世代を必要とするかもしれません。その場合、最大永久生成サイズは、コマンドラインオプション-XX:MaxPermSize =を使用して増やすことができます。

この他のOracleドキュメント は他のHotSpot引数をリストしていることに注意してください。

更新: Java 8以降では、permgenスペースとこの設定の両方がなくなりました。ロードされたクラスとメソッドに使用されるメモリモデルは異なり、制限はありません(デフォルト設定で)。このエラーはもう表示されません。

246
Denys Séguret

-XX:PermSize -XX:MaxPermSizeは、パーマネントジェネレーションのサイズを設定するために使用されます。

パーマネントジェネレーション:パーマネントジェネレーションはクラスファイルが保存される場所です。これらはコンパイル済みクラスとJSPページの結果です。このスペースがいっぱいになると、フルガベージコレクションがトリガーされます。 Full Garbage Collectionが古い参照されていないクラスを一掃できず、Permanent Spaceを拡張する余地がない場合、Out-of-Memoryエラー(OOME)がスローされ、JVMがクラッシュします。

81
stones333

Java 8では、このパラメータは一般的に次のような警告メッセージを表示するために使用されます。

Java HotSpot(TM)64ビットサーバーVM警告:オプションMaxPermSize = 512mを無視します。サポートは8.0で削除されました

Java 8でこのメッセージが表示されるのは、PermGenの欠点のいくつかに対処するためにPermgenがMetaspaceに置き換えられたためです(自分で確認できたように、これらの欠点の1つは固定サイズであることです)。

参考:Metaspaceに関する記事: http://Java-latte.blogspot.in/2014/03/metaspace-in-Java-8.html

41
AndrewBourgeois