先日、Apache Tomcatの運用環境でjava.lang.OutOfMemoryError: PermGen space.
が発生した。どうもこれは、Permanent(パーマメント)領域が不足しているっぽいので増やすことにした。
スポンサーリンク
Permanent(パーマメント)領域って何?
JVMのメモリでヒープ領域と言えば、多くの方が耳にしたことがあり、メモリの解放を忘れてOutOfMemoryError
が発生し、アプリが異常終了した経験がある方も多いと思います。
ヒープ領域は「New世代領域」「Old世代領域」および「Permanent領域」の3つに大きく3つで構成されます。
「New世代」と「Old世代領域」は、インスタンスを生成したクラスのオブジェクトや配列などを管理し、「Permanent領域」はクラスローダーが読み込んだJavaのクラス、メソッドや定数などのメタデータを管理します。
上述のようにPrmanent領域には、クラスローダー(ClassLoder)を通じて、自前で作成したクラスや、外部のライブラリ(jar)から読み込んだクラスのメタデータを格納する領域で、使用するライブラリのサイズが大きかったり、読み込むクラス数が多いと領域不足になり、OutOfMemoryError
が発生することがあります。
Prmanent領域のデフォルト値
Permanent領域のサイズは、下記表の通り-XX:PermSize
と-XX:MaxPermSizeの
2つのオプションで指定し、デフォルト値も次の通りです。
オプション名 | 意味 | デフォルト値 |
---|---|---|
-XX:PermSize | Permanent領域の初期値 | 1MB |
-XX:MaxPermSize | Permanent領域の最大値 | 64MB |
WindowsでPermanent領域のサイズ指定
Windowsサービス化されているTomcatでは、Monitor Tomcatを使ってGUI上で指定するのが最も手軽です。
Monitor Tomcat上で、Permanent領域のサイズを指定する方法は次の通りです。
- スタートメニューから [Monitor Tomcat]を起動
- [Java]タブを選択
- JVMの起動オプションに
-XX:PermSize=○○M
または-XX:MaxPermSize=○○M
を指定(両方指定してもよい)
設定が完了して保存をしたら、Tomcatを再起動して設定を判定します。
0 件のコメント:
コメントを投稿