7.14.4 Explicitメモリブロックの初期化が失敗した場合の確認と対処
Explicitメモリブロックの初期化が失敗した場合の確認と対処について説明します。
Explicitメモリブロックの数が最大になると,それ以上Explicitメモリブロックを初期化できなくなります。
この場合は,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メモリブロックの初期化に失敗した回数です。この例の場合は,「0」です。初期化失敗が発生していない,問題のない状態です。
また,JavaVMの-XX:HitachiExplicitMemoryLogLevelオプションに「verbose」を指定した場合,Explicitメモリブロックの初期化失敗イベントについての情報も出力されます。
出力例を示します。
[EVO]<Tue Jul 24 01:23:51 2007>[Creation failed][EH: 32760K(0K)/32768K/65536K][E/F/D: 65535/0/0][Thread: 0x00035a60] [EVO][Thread: 0x00035a60] at ExplicitMemory.registerExplicitMemory(Native Method) [EVO][Thread: 0x00035a60] at BasicExplicitMemory.<init>(Unknown Source) [EVO][Thread: 0x00035a60] at AllocTest.test(AllocTest.java:64) [EVO][Thread: 0x00035a60] at java.lang.Thread.run(Thread.java:2312)
背景色付きの太字で示した部分で,Explicitメモリブロック初期化に失敗したことが確認できます。また,[EVO][Thread: 0x00035a60]で始まる行は,イベントが発生した時のスタックトレースを示しています。
さらに,JavaVMの-XX:HitachiExplicitMemoryLogLevelオプションに「debug」を指定した場合,初期化に失敗したイベント以外のExplicitメモリブロック初期化イベントの詳細情報が出力されます。Explicitメモリブロック数が一定以上になると,初期化は失敗します。このため,初期化に失敗する前の初期化イベントの情報が,調査に役立つことがあります。
出力例を次に示します。
[EVO]<Tue Jul 24 01:23:51 2007>[Created]["BasicExplicitMemory-2" eid=2(0x1234568)/B][Thread: 0x00035a60] [EDO][Thread: 0x00035a60] at ExplicitMemory.registerExplicitMemory(Native Method) [EDO][Thread: 0x00035a60] at BasicExplicitMemory.<init>(Unknown Source) [EDO][Thread: 0x00035a60] at AllocTest.test(AllocTest.java:64) [EVO][Thread: 0x00035a60] at java.lang.Thread.run(Thread.java:2312)
背景色付きの太字で示した部分で,Explicitメモリブロック初期化イベントであることが確認できます。また,[EDO][Thread: 0x00035a60]で始まる行は,イベントが発生した時のスタックトレースを示しています。
(2) スレッドダンプで出力されたログファイルからの調査
スレッドダンプで出力された情報からは,Explicitメモリブロック初期化失敗の直接要因は確認できませんが,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.ExplicitMemory.countExplicitMemories()
ただし,このAPIでは,Explicitメモリブロック初期化失敗の直接の要因は確認できません。