JDK 8でのPermGenの削除


229

JDK 8をインストールし、Eclipseを実行しようとしています。次の警告メッセージが表示されます。

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

このVMオプションを無視する理由は何ですか?


回答:


358

これらの引数を無視する理由は恒久的な生成であるHotSpot for JDK8では、次の欠点のため削除されました。

  • 起動時の固定サイズ–調整が難しい。
  • 内部ホットスポットタイプはJavaオブジェクトでした:完全なGCで移動でき、不透明で、強く型付けされておらず、デバッグが困難で、メタメタデータが必要です。
  • 完全なコレクションを簡素化:各コレクターのメタデータ用の特別なイテレーター
  • GCの一時停止中にではなく、同時にクラスデータの割り当てを解除したい
  • PermGenによって制限されていた将来の改善を可能にします。

Permanent Generation(PermGen)スペースは完全に削除され、メタスペースと呼ばれる新しいスペースに置き換えられています。PermGenの削除の結果、明らかに、PermSizeおよびMaxPermSize JVM引数が無視され、java.lang.OutOfMemoryError:PermGenエラーが発生することはありません。

MetaSpaceの利点

  • Java言語仕様のプロパティを利用する:クラスおよび関連するメタデータの有効期間はクラスローダーのライフタイムと一致
  • ローダーごとのストレージ領域–メタスペース
  • 線形割り当てのみ
  • 個別の再利用なし(RedefineClassesとクラスの読み込みエラーを除く)
  • GCスキャンまたは圧縮なし
  • メタスペースオブジェクトの再配置なし

メタスペースの調整

メタスペースの最大サイズは、-XX:MaxMetaspaceSizeフラグを使用して設定できます。デフォルトは無制限です。つまり、システムメモリのみが制限になります。-XX:MetaspaceSizeチューニングフラグは、メタスペースの初期サイズを定義します。このフラグを指定しない場合、メタスペースは、実行時のアプリケーションの要求に応じて動的にサイズ変更されます。

変更により、将来的に他の最適化と機能が可能になります

  • アプリケーションクラスのデータ共有
  • 若いコレクションの最適化、G1クラスのアンロード
  • メタデータサイズの縮小と内部JVMフットプリントプロジェクト

GCパフォーマンスも改善されています。もっと詳しく


29
私はインターンの文字列が以前PermGenスペースに格納されていましたが、Java 7でメインJavaヒープに移動されたことを言及する必要があります
gparyani

詳しい説明ありがとうございます。
Pradeep

3
一般の読者向けの少し穏やかな紹介(つまり、主にJava以外の人々、たとえば、仲間の開発者がJVMに対処する必要がある)は、この回答に害を与えません。
ulidtko


19

Permanent Generation(PermGen)スペースは完全に削除され、Metaspaceと呼ばれる新しいスペースに置き換えられます。PermGen削除の結果は、明らかにPermSizeおよびMaxPermSize JVM引数が無視され、java.lang.OutOfMemoryError:PermGenエラーが発生することはありません。 JDK 8 HotSpot JVMは、クラスメタデータの表現にネイティブメモリを使用するようになり、メタスペースと呼ばれます。 続きを読む>>


3
'HotSpot JVMは、クラスメタデータの表現にネイティブメモリを使用するようになりました。-そして、以前にHotSpot JVMが使用したメモリは?そして、「ネイティブメモリ」の免責とは何ですか?
Andrey M. Stepanov


12

Java 8では、PermGenスペースはMetaSpaceに置き換えられています。PermSizeおよびMaxPermSize JVM引数は無視され、起動時に存在する場合は警告が発行されます。

クラスメタデータのほとんどの割り当ては、ネイティブメモリから割り当てられます。*クラスメタデータの記述に使用されていたクラスが削除されました。

古いPermGenと新しいMetaSpaceの主な違いは、メモリ使用量の上限を定義する必要がないことです。MetaSpaceのスペース制限を無制限に保つことができます。したがって、メモリ使用量が増加してもOutOfMemoryErrorエラーは発生しません。代わりに、予約されたネイティブメモリが増加して、メモリ使用量がいっぱいになります。

MetaSpaceのスペースの上限を定義すると、OutOfMemoryError:Metadata spaceがスローされます。したがって、メモリの浪費を回避できるように、この制限を慎重に定義することが重要です。


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