1. ホーム

[解決済み】JDK 8におけるPermGenの排除について

2022-04-03 12:48:46

質問

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

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

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

解決方法は?

これらの引数を無視する理由は、以下の欠点があるため、HotSpot for JDK8 では永久的な生成が削除されたからです。

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

パーマネント・ジェネレーション(PermGen)スペースは完全に削除され、メタスペースという新しいスペースに置き換わったようなものです。 PermGen が削除された結果、明らかに PermSizeとMaxPermSizeのJVM引数は無視されます。 となり、java.lang.OutOfMemoryErrorが発生することはありません。PermGenエラーが発生することはありません。

MetaSpaceのメリット

  • Java言語仕様のプロパティを利用:クラスと関連するメタデータの寿命はクラスローダーのものと一致する。
  • ローダーごとの保存領域 - メタスペース
  • リニアアロケーションのみ
  • 個別再利用なし(RedefineClassesとクラスの読み込み失敗を除く)
  • GCスキャン、コンパクションなし
  • メタスペースオブジェクトのリロケーションなし

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

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

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

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

また、GC性能も向上しています。 詳細