永久世代のヒープ領域とメタ領域

Sarwan Soomro 2024年2月16日
  1. Java の永久世代ヒープ領域
  2. Java における PermGen の主な特徴
  3. PermGen と Java のメタスペース
  4. メタスペース (Java 8)
  5. まとめ
永久世代のヒープ領域とメタ領域

この JVM メモリ空間の簡単なデモンストレーションでは、Java 仮想マシンがユーザー データのメモリ割り当てをどのように処理するかを調べます。 このトピックをグラフでカバーすることはしませんが、かなり基本的なものであり、理解を深めるにはこの説明で十分であると考えています。

さらに、PermGen と Metaspace、およびその両方を比較します。 この短い記事には多くの情報が含まれているため、読み続けて詳細を確認してください。

Java の永久世代ヒープ領域

PermGen は、Java 仮想マシンで使用される永続世代ヒープ領域の短縮形です。 すべてのクラス、メソッド、オブジェクト、内部化された文字列などを占めるスペースです。

ほとんどのアプリケーションでは、パーマネント生成がガベージ コレクターの効率に目に見える影響を与えることはありません。 それでも、JSP などの多くのクラスを動的に作成してロードするアプリケーションもあります。

ノート
上記のアプリでは、追加のクラスに対応するために、より大きなパーマネント ジェネレーションが必要になる可能性があります。

そのような場合は、コマンド ラインを使用して MAX: PermGen サイズを増やすことができます。 MAXを増やすコマンド: PermGen サイズ: -XX:MaxPermSize=SIZE, -XX:PermSize=[size].

しかし、ここで注意すべきことが 1つあります。 Java は Java Development Kit バージョン 8 リリースでこのメモリ空間を削除したため、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

Java における PermGen の主な特徴

PG もフル ガベージ コレクションに含まれます。

  1. JVM クラス メタデータ用のスペース。
  2. Hotspot での Java クラスの内部表現。
  3. クラス構造、フィールド、および識別子に関する情報。
  4. メソッドのコンパイルとバイトコードに関する情報。
  5. 変数
  6. 常時プールとシンボリック解決。

PermGen の一般的な問題:

  1. MaxPermSize のメモリ制限。
  2. MaxPermSize を大きくすると、再起動が発生しました。
  3. メモリ不足エラーの問題。
  4. アプリケーションの参照により、クラスのアンロードがトリガーされました。
  5. MaxPermSize (64 MB から 85 MB のみ)。

これらの問題に加えて、ここで読むべき他の問題があります: 12

PermGen と Java のメタスペース

Java 8 以降、PermGen が Metaspace に置き換えられました。 この変更にもわずかな違いがありました。

たとえば、メタスペースには無制限のデフォルトの最大サイズがありますが、前者にはありませんでした。 公式ドキュメントを読むと、PermGen のデフォルトの最大サイズは 32 ビット JVM で 64 MB であることがわかります。

同様に、Java 7 以前のバージョンの 64 ビット JVM では 82 MB です。 しかし、これで、メモリ不足エラーはもはや問題ではないことがわかりました。

代わりに、メタスペースを探索する必要はありませんか? 明らかに、はい。

メタスペース (Java 8)

Java VM がクラス、メソッド、変数、文字列などのメモリを保持する場所であるコンテナーと考えてください。以前のメモリ空間とこのメモリ空間の最も重要な違いをすでに示しているためです。

それでは早速、Metaspace の違いを見ていきましょう。

次の表では、Metaspace と PermGen を比較対照しています。

S.N 永久世代 メタスペース
1 PermGen Space は Java 8 で廃止されました。 Java 8 でリリースされた新しいスペース メタスペースに置き換えられました。
2 名前が示すように、常に一定のメモリ サイズがありました。 オペレーティング システムに応じたメモリの動的割り当て。
3 無効なガベージ コレクター (GC)。 実効GC
ノート
PermGen のメモリ不足エラーは、メタスペースに置き換えられてから問題ではなくなりました。

それにもかかわらず、これについて詳しく知りたい場合は、このリンクを参照してください: 仮想マシン ガベージ コレクション チューニング

まとめ

簡潔で要点を絞った記事でしたが、パーマネント ジェネレーションとメタスペースのメモリ空間、ガベージ コレクタの役割、および JVM がそれらすべてをどのように構造化するかについて簡単に説明しました。

それに加えて、リアルタイムの例と参考文献を引用して、それぞれを区別しました。 簡単に言うと、パーマネント世代は JDK 7 以前のバージョンにも存在します。

一方、メタスペースは、より信頼性が高く柔軟なメモリ空間をアプリケーションに提供します。

著者: Sarwan Soomro
Sarwan Soomro avatar Sarwan Soomro avatar

Sarwan Soomro is a freelance software engineer and an expert technical writer who loves writing and coding. He has 5 years of web development and 3 years of professional writing experience, and an MSs in computer science. In addition, he has numerous professional qualifications in the cloud, database, desktop, and online technologies. And has developed multi-technology programming guides for beginners and published many tech articles.

LinkedIn