1前書き

このクイックチュートリアルでは、Java環境におけるPermGenとMetaspaceのメモリ領域の違いを調べます。

Java 8から始まって、MetaspaceがPermGenに取って代わり、いくつかの実質的な変更をもたらすことを心に留めておくことは重要です。


2 PermGen

  • PermGen(Permanent Generation)は、メインメモリのヒープとは別に特別なヒープスペースです。

JVMはPermGen内のロードされたクラスメタデータを追跡します。

さらに、JVMはこのメモリセクションにすべての静的コンテンツを格納します。これにはすべての静的メソッド、プリミティブ変数、そして静的オブジェクトへの参照が含まれます。

さらに、** バイトコード、名前、JIT情報に関するデータが含まれています。 Java 7より前は、文字列プールもこのメモリの一部でした。固定プールサイズの短所は、https://www.baeldung.com/java-string-pool[write-up]に記載されています。

32ビットJVMのデフォルトの最大メモリサイズは64 MBで、64ビットバージョンの場合は82 MBです。

ただし、JVMオプションを使用してデフォルトサイズを変更できます。


  • -XX:PermSize =[size]

    は、PermGenの初期サイズまたは最小サイズです。

スペース
**

-XX:MaxPermSize =[size]

は最大サイズです

最も重要なことに、OracleはJDK 8リリースでこのメモリスペースを完全に削除しました。

  • その限られたメモリサイズで、PermGenは有名な

    OutOfMemoryError

    ** の生成に関与しています。簡単に言えば、https://www.baeldung.com/java-classloaders[クラスローダー]は正しくガベージコレクションされていないため、結果としてメモリリークが発生します。

したがって、https://www.baeldung.com/java-gc-overhead-limit-exceeded[メモリスペースエラー]を受け取ります。新しいクラスローダを作成している間、これはほとんど開発環境で起こります。


3メタスペース

簡単に言うと、MetaspaceはJava 8バージョンから始まる新しいメモリスペースです。

古いPermGenのメモリ空間を置き換えました

。最も重要な違いは、メモリ割り当ての処理方法です。

その結果、このネイティブメモリ領域はデフォルトで自動的に大きくなります。

ここには、メモリを調整するための新しいフラグもあります。


  • MetaspaceSize

    と__MaxMetaspaceSize – メタスペースを設定できます

上限


  • __MinMetaspaceFreeRatio –

    __はクラスの最小割合です

後のメタデータ容量の解放

ガベージコレクション

**

MaxMetaspaceFreeRatio

– クラスメタデータの最大パーセンテージ

スペース量の減少を避けるために、ガベージコレクション後の空き容量

さらに、ガベージコレクションプロセスもこの変更からいくつかの利点を得ます。クラスメタデータの使用量が最大メタスペースサイズに達すると、ガベージコレクタは自動的に無効クラスのクリーンアップをトリガするようになりました。

したがって、** この改善により、JVMは

OutOfMemory

エラーを発生する可能性を減らします。

これらすべての改善にもかかわらず、メモリリークを回避するためにメタスペースを監視しhttps://www.baeldung.com/jvm-parameters[調整]する必要があります。


4概要

この記事では、PermGenとMetaspaceのメモリ領域について簡単に説明します。さらに、それぞれの主な違いについても説明しました。

PermGenはJDK 7以前のバージョンではまだ使用されていますが、Metaspaceは、より柔軟で信頼性の高いメモリ使用量をアプリケーションに提供します。