1
0

Javaのパーマネント領域(PermGen)について

Posted at

はじめに

Javaのメモリ管理にはさまざまな領域があります。その中でも、パーマネント領域(Permanent Generation、通称PermGen)は特に重要です。

PermGenの役割

パーマネント領域(PermGen)は、Javaヒープの一部で、以下のような永続的なデータを保存するために使用されます。

  • クラスメタデータ: クラスのロード時にJVMによって生成されるメタデータ。クラスのバイトコード、メソッド情報、フィールド情報などが含まれます。
  • インターナの文字列プール: Stringクラスのインターナ文字列(interned strings)。
  • 静的変数: クラスの静的変数もPermGenに保存されます。

PermGenの構造

PermGenはヒープ領域とは異なり、Garbage Collection(GC)による管理が複雑です。通常のヒープ領域が若い世代(Young Generation)と老いた世代(Old Generation)に分かれているのに対し、PermGenは以下の2つの領域で構成されます。

  1. Class Area: クラスのメタデータを保存します。
  2. Non-Class Area: クラス以外のデータ(インターナ文字列など)を保存します。

PermGenの問題点

PermGenにはいくつかの問題点があります。

メモリ不足(OutOfMemoryError: PermGen space)

PermGenのサイズは固定されており、動的に拡張できません。そのため、多数のクラスを動的にロード・アンロードするアプリケーションでは、PermGenのメモリ不足が発生することがあります。このエラーは次のような場合に発生します。

  • 大量のクラスをロードする場合
  • クラスのアンロードが適切に行われない場合
  • デプロイメントサイクルが頻繁な場合(特にWebアプリケーション)

Java 8以降の変更点

Java 8では、PermGenが廃止され、新たにメタスペース(Metaspace)という領域が導入されました。メタスペースは、以下の点でPermGenと異なります。

  • サイズの自動調整: メタスペースは、必要に応じて動的に拡張されます。これにより、PermGenで発生していたメモリ不足の問題が解消されます。
  • ネイティブメモリの利用: メタスペースはヒープ外のネイティブメモリを使用します。

メタスペースの利点

  • OutOfMemoryErrorの減少: 動的なサイズ調整により、メモリ不足の問題が大幅に減少しました。
  • GCパフォーマンスの向上: メタスペースはヒープ外メモリを使用するため、GCの負荷が軽減されます。

メタスペースの設定

メタスペースのサイズは以下のように設定できます。

-XX:MetaspaceSize=<size>
-XX:MaxMetaspaceSize=<max size>

例:

-XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize=512M

PermGenとメタスペースの比較

特徴 PermGen メタスペース
メモリ割り当て 固定サイズ 動的に拡張
メモリの場所 ヒープ内 ヒープ外のネイティブメモリ
エラー OutOfMemoryError: PermGen space OutOfMemoryError: Metaspace
パフォーマンス GCに悪影響を与えることがある GCパフォーマンスが向上

まとめ

Javaのパーマネント領域(PermGen)は、クラスメタデータや静的変数などの永続的なデータを保存するための重要なメモリ領域です。しかし、その固定サイズとGCパフォーマンスの問題から、Java 8ではメタスペースに置き換えられました。メタスペースは動的にサイズを調整できるため、PermGenの問題を解消し、GCのパフォーマンスを向上させています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0