web-dev-qa-db-ja.com

JDK 8でのPermGenの削除

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

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

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

208
Shamim Ahmmed

これらの議論を無視する理由は、恒久的な生成がJDK 8のためのHotSpotで削除されたためです。

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

Permanent Generation(PermGen)スペースは完全に削除され、Metaspaceと呼ばれる新しいスペースに置き換えられました。 PermGenを削除した結果、JVMの引数およびMaxPermSizeは無視され、Java.lang.OutOfMemoryErrorが返されることはありません。 :PermGenエラー.

メタスペースの利点

  • Java Language Specificationプロパティを利用する:クラスとそれに関連するメタデータの有効期間はクラスローダのものと一致
  • ローダごとの記憶領域 - メタスペース
  • 線形割り当てのみ
  • 個別のレクラメーションはありません(RedefineClassesおよびクラスのロード失敗を除く)
  • GCスキャンまたは圧縮なし
  • メタスペースオブジェクトの再配置なし

メタスペースチューニング

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

変更は将来的に他の最適化と機能を可能にします

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

改善されたGC性能もあります。 詳細

329
pardeep131085

これは、Java 8の新機能の1つであり、 JDK拡張提案122 の一部です。

Hotspot JVMからパーマネントジェネレーションを削除して、パーマネントジェネレーションのサイズを調整する必要性を取り除きます。

Java 8に含まれる予定のすべてのJEPのリストは、 JDK8マイルストーンページ にあります。

113
assylias

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

18
Dhrumil Shah

PermGenスペースが削除されたため。メモリ管理は少し変わりました。

http://Java.dzone.com/articles/Java-8-permgen-metaspace

15
Sebastian Redl

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

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

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

MetaSpaceの最大スペース制限を定義すると、OutOfMemoryError:Metadata spaceがスローされます。したがって、メモリの無駄を避けるために、この制限を慎重に定義することが重要です。

10
Shubham Pandey

Java 8のためのOracleのJVM実装はPermGenモデルを取り除き、 Metaspace に置き換えました。

8
chrylis