1. 序章

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

Java 8以降、メタスペースがPermGenに置き換わり、大幅な変更が行われることを覚えておくことが重要です。

2. PermGen

PermGen(Permanent Generation)は、メインメモリヒープから分離された特別なヒープスペースです。

JVMは、PermGenにロードされたクラスメタデータを追跡します。 さらに、JVMはすべての静的コンテンツをこのメモリセクションに格納します。 これには、すべての静的メソッド、プリミティブ変数、および静的オブジェクトへの参照が含まれます。

さらに、には、バイトコード、名前、およびJIT情報に関するデータが含まれています。 Java 7より前は、文字列プールもこのメモリの一部でした。 固定プールサイズの欠点は、記事に記載されています。

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

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

  • -XX:PermSize = [size] は、PermGenスペースの初期サイズまたは最小サイズです
  • -XX:MaxPermSize =[size]は最大サイズです

最も重要なことは、OracleがJDK8リリースでこのメモリスペースを完全に削除したことです。したがって、Java 8以降のバージョンでこれらのチューニングフラグを使用すると、次の警告が表示されます。

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version
OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
...

メモリサイズが限られているため、PermGenは有名なOutOfMemoryErrorの生成に関与しています。 簡単に言うと、クラスローダーは適切にガベージコレクションされなかったため、メモリリークが発生しました。

したがって、メモリスペースエラーを受け取ります。 これは主に、新しいクラスローダーを作成する際の開発環境で発生します。

3. メタスペース

簡単に言えば、Metaspaceは新しいメモリスペースです–Java8バージョンから始まります。 古いPermGenメモリスペースに取って代わりました。 最も重要な違いは、メモリ割り当ての処理方法です。

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

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

  • MetaspaceSizeおよびMaxMetaspaceSize–メタスペースの上限を設定できます。
  • MinMetaspaceFreeRatio – は、ガベージコレクションの後に解放されるクラスメタデータ容量の最小パーセンテージです。
  • MaxMetaspaceFreeRatio –スペースの量の減少を回避するために、ガベージコレクション後に解放されるクラスメタデータ容量の最大パーセンテージです。

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

したがって、この改善により、JVMはOutOfMemoryエラーを取得する可能性を減らします。

これらすべての改善にもかかわらず、メモリリークを回避するために、メタスペースを監視および調整する必要があります。

4. 概要

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

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