7.9 Javaヒープ内のMetaspace領域のメモリサイズの見積もり
この節では,SerialGC使用時のMetaspace領域のメモリサイズの見積もりについて説明します。Metaspace領域は,ロードされたclassなどが格納される領域です。
Metaspace領域のメモリサイズは,「7.2.6 SerialGC使用時のJavaVMで使用するメモリ空間の構成とJavaVMオプション」で示したとおり,-Xmxオプションで指定したメモリサイズ(Javaヒープ)とは別に確保されます。
デフォルト値については,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「14.4 Application Serverで指定できるJava HotSpot VMのオプションのデフォルト値」を参照してください。
次に,Metaspace領域の使用量の見積もり方法を示します。
-
Metaspace領域の使用量の見積もり方法
Metaspace領域でのメモリ使用量は,大体,J2EEサーバにロードされるクラスファイルの合計サイズになります。アプリケーションサーバの場合,次に示すクラスファイルのサイズの総和から見積もることができます。
-
WEB-INF/classes以下のすべてのクラスファイル
-
WEB-INF/lib以下のJARファイルに含まれる,すべてのクラスファイル
-
JSPコンパイル結果として生成された,すべてのクラスファイル
-
EJB-JARに含まれるすべてのクラスファイル
-
コンテナ拡張ライブラリ,ライブラリJAR,参照ライブラリを利用している場合に追加するJARファイルに含まれる,すべてのクラスファイル
-
コンテナが作成するクラスファイル
アプリケーション開始後のMetaspace領域−アプリケーション登録前のMetaspace領域。実際にJ2EEサーバを起動し,Metaspace領域を確認して算出してください。
-
アプリケーションサーバ提供のクラスファイル(システムクラスファイル)
システムクラスファイルの総和は約160メガバイトになります。
-
JDK提供のクラスファイル
JDK提供のクラスファイルの総和は約110メガバイトになります。
-
リフレクション処理が生成する動的クラス
リフレクション処理では処理の高速化のため,呼び出し用のクラスを動的に生成します。
このクラスが占めるサイズについてはサーバ起動から十分な時間経過するまでの間に増加したMetaspace利用サイズを目安として実測で求めてください。
Metaspace領域のメモリサイズは,-XX:MaxMetaspaceSize=<size>オプション,および-XX:MetaspaceSize=<size>オプションで指定します。これらのオプションのデフォルト値については,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「14.4 Application Serverで指定できるJava HotSpot VMのオプションのデフォルト値」を参照してください。
なお,アプリケーションのインポート時に一時的にMetaspace領域の使用量が増加する場合があります。
- 参考
-
開発環境でのソフト参照によるMetaspace領域の圧迫の解消方法
ソフト参照の影響によって,アプリケーションをアンデプロイしたときにMetaspace領域の解放が遅延することがあります。このため,開発環境などでアプリケーションのデプロイおよびアンデプロイを繰り返した場合,Metaspace領域の解放遅延が原因で,Metaspace領域が圧迫されることがあります。ソフト参照によるMetaspace領域の圧迫は,次のオプションを指定すると解消できます。
-
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:SoftRefLRUPolicyMSPerMBオプションに0を指定すると,すべてのソフト参照が無効になります。ソフト参照は,性能向上のためのキャッシュとして使用されることが多いため,このオプションの指定によってアプリケーションの性能が劣化するおそれがあります。このため,このオプションは,開発環境でMetaspace領域が圧迫された場合にだけ指定してください。
-
-