7.14.3 Explicitヒープあふれが発生した場合の確認と対処
Explicitヒープあふれが発生した場合の確認と対処について説明します。
-
Explicitヒープを最大サイズまで使い切った状態
-
Explicitメモリブロック拡張時にOSからのメモリ確保に失敗する状態
Explicitヒープあふれが発生すると,発生後に領域を拡張しようとしたExplicitメモリブロックのサブ状態が,「Enable」から「Disable」に変わります。「Disable」になったExplicitメモリブロックには,オブジェクトを配置できません。
Explicitヒープあふれが発生しているかどうかは,明示管理ヒープ機能のイベントログまたはスレッドダンプの内容から調査できます。また,Java APIで取得した情報で確認することもできます。
Explicitヒープあふれが発生した場合は,次の対処を実施してください。
- Explicitヒープあふれが発生した場合の対処
-
-
Explicitヒープの最大サイズを増やす。
-XX:HitachiExplicitHeapMaxSizeオプションの指定を変更します。
-
Explicitヒープの最大サイズに達していない状態であふれた場合は,OSからのメモリ確保可能サイズを増やす。
アプリケーションサーバが利用できるメモリサイズを増やしてください。
-
Explicitヒープを大量に消費している原因を取り除く。
-
ここでは,Explicitヒープあふれが発生しているかどうかの確認方法について説明します。
(1) 明示管理ヒープ機能のイベントログの調査
明示管理ヒープ機能のイベントログで調査をするためには,あらかじめJavaVMの-XX:HitachiExplicitMemoryLogLevelオプションに「normal」を指定しておく必要があります。これによって,GCが発生するごとに,明示管理ヒープ機能のイベントログにExplicitメモリブロックの利用状況が出力されるようになります。
出力例を示します。
[ENS]<Thu Oct 21 14:55:50 2007>[EH: 12672K->12800K(12800K/65536K)][E/F/D: 200/0/0][cause:GC][CF: 0]
背景色付きの太字で示した部分が,Explicitメモリブロックの数を示しています。「E」および「D」は,Explicitメモリブロックのサブ状態である「Enable」および「Disable」を表します。「Disable」のExplicitメモリブロックがある場合は,Explicitヒープあふれが発生しています。この例の場合は,「Enable」のExplicitメモリブロックが200個あり,「Disable」のExplicitメモリブロックはないことがわかります。なお,「Disable」のExplicitメモリブロックがある場合は,Explicitヒープ最大サイズとの関係を確認してください。Explicitヒープ最大サイズまでに余裕があるときには,OSからのメモリ確保に失敗していることが考えられます。
また,JavaVMの-XX:HitachiExplicitMemoryLogLevelオプションに「verbose」を指定した場合,Explicitメモリブロックのサブ状態が「Disable」になった要因も出力されます。
出力例を示します。
[EVO]<Tue Jul 24 01:23:51 2007>[alloc failed(Disable)][EH: 32760K(0K)/32768K/65536K][E/F/D: 321/0/1][cause:GC]\ ["BasicExplicitMemory-3" eid=3/B: 128K(0K)/128K][Thread: 0x00035a60] [EVO][Thread: 0x00035a60] at ExplicitMemory.newInstance0(Native Method) [EVO][Thread: 0x00035a60] at BasicExplicitMemory.newInstance(Unknown Source) [EVO][Thread: 0x00035a60] at AllocTest.test(AllocTest.java:64) [EVO][Thread: 0x00035a60] at java.lang.Thread.run(Thread.java:2312)
この例は,Explicitヒープあふれが発生した場合の例です。
背景色付きの太字で示した部分のうち,[alloc failed(Disable)]が,Explicitメモリブロックのサブ状態が「Disable」になった要因を示します。["BasicExplicitMemory-3" eid=3/B: 128K(0K)/128K]は,「Disable」になったExplicitメモリブロックの情報を示します。また,[EVO][Thread: 0x00035a60]で始まる行は,イベントが発生した時のスタックトレースを表しています。ただし,GCによるオブジェクトの移動でExplicitヒープあふれが発生した場合,スタックトレースは出力されません。
(2) スレッドダンプで出力されたログファイルからの調査
cjdumpsvコマンドなどを使用してスレッドダンプを出力することによって,各Explicitメモリブロックのサブ状態を出力できます。
出力例を次に示します。
Explicit Heap Status -------------------- max 65536K, total 21888K, used 20992K, garbage 1288K (32.0% used/max, 95.9% used/total, 6.1% garbage/used), 2 spaces exist Explicit Memories(0x12345678) "EJBMgrData" eid=1(0x02f25610)/R, total 21376K, used 20480K, garbage 1234K (95.8% used/total, 6.0% garbage/used, 0 blocks) Enable "ExplicitMemory-4" eid=4(0x02f45800)/B, total 512K, used 512K, garbage 54K (100.0% used/total, 10.5% garbage/used, 0 blocks) Disable
背景色付きの太字で示した部分が,それぞれのExplicitメモリブロックのサブ状態を表しています。
(3) JavaのAPIからの調査
次に示すメソッドを使用して,Explicitメモリブロックのサブ状態を調査できます。
-
JP.co.Hitachi.soft.jvm.MemoryArea.ExplicitMemory.isActive()
-
JP.co.Hitachi.soft.jvm.MemoryArea.ExplicitMemory.isReclaimed()
これらのメソッド両方の戻り値がfalseの場合,そのExplicitメモリブロックのサブ状態はDisableと判断できます。