PermgenとJavaのメタスペース

JavaでのPermgenとMetaspace

1. 前書き

このクイックチュートリアルでは、Java環境のwe’re going to examine the differences between the PermGen and Metaspace memory regionsを使用します。

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

2. PermGen

PermGen (Permanent Generation) is a special heap space separated from the main memory heap

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

さらに、it contains data about bytecode, names and JIT information。 Java 7より前は、文字列プールもこのメモリの一部でした。 固定プールサイズの欠点は、write-upにリストされています。

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

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

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

  • -XX:MaxPermSize=[size]は最大サイズです

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

With its limited memory size, PermGen is involved in generating the famous OutOfMemoryError。 簡単に言うと、class loadersは適切にガベージコレクションされておらず、その結果、メモリリークが発生していました。

したがって、memory space errorを受け取ります。これは主に、新しいクラスローダーの作成中に開発環境で発生します。

3. メタスペース

簡単に言えば、Metaspaceは新しいメモリスペースです– Java8バージョンから始まります。 it has replaced the older PermGen memory space。 最も大きな違いは、メモリ割り当ての処理方法です。

その結果、this native memory region grows automatically by default。 ここには、メモリを調整するための新しいフラグもあります。

  • MetaspaceSizeおよびMaxMetaspaceSize –メタスペースの上限を設定できます。

  • MinMetaspaceFreeRatio – isgarbage collection後に空いているクラスメタデータ容量の最小パーセンテージ

  • MaxMetaspaceFreeRatio –スペースの量の減少を回避するための、ガベージコレクション後に解放されるクラスメタデータ容量の最大パーセンテージです。

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

したがって、with this improvement, JVM reduces the chance to get the OutOfMemory error

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

4. 概要

この簡単な説明では、PermGenおよびMetaspaceのメモリ領域の簡単な説明を示します。 さらに、それぞれの主な違いについて説明しました。

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