ISA-7 ISA MDD4J System Technical Service Center | ISA-7 ISA MDD4Jの使い方
by user
Comments
Transcript
ISA-7 ISA MDD4J System Technical Service Center | ISA-7 ISA MDD4Jの使い方
System Technical Service Center | ISA-7 ISA MDD4Jの使い方 1/6 IBM System Technical Service Center Update on 2009-10-27 ISA-7 ISA MDD4Jの使い方 目標 この章では、MDD4J (The Memory Dump Diagnostic for Java tool)を使用してHeapdumpを解析します。 目次 1. MDD4Jの起動とHeapdump解析 2. Analysis Summary 3. Reach Size Leak Suspects 4. Object Tables 5. Data Structures 6. ハンズオン資料解析 1. MDD4Jの起動とHeapdump解析 1). MDD4Jを起動します。 1) 「問題分析」の「ツール」タブを開き、「ケース/問題」に「5.ISA ガイド付きトラブルシューターを用いた問題分析」で作成した「OOM」ケースを選択し、MDD4J(3.0)を起動 します。 ※ケースに資料を追加していない場合には、「デフォルト」のままで構いません。 "問題分析" > (ツール) "Memory Dump diagnostic for Java (MDD4J) version 3.0" 2) 「primary dump(Optional)」にケース「OOM」に追加したheapdumpファイルを選択し、"次へ"をクリックします。 オプショナルなのでここでは指定しなくても問題ありません。 ※heapdumpファイルを指定しての起動に失敗する場合には、ここではファイルを指定せずに起動してください。 System Technical Service Center | ISA-7 ISA MDD4Jの使い方 2/6 ケースに資料を追加していない場合にはフルパス指定してください。 WASでは、デフォルトでは<WAS_ROOT>\profiles\<profile_name> 直下に出力されます。 3) (2)でファイルを指定しなかった場合)MDD4Jが起動したら、"Single Heapdump Analysis" をチェック、解析するHeapdumpを"Primary Heapdump"に指定し て"Analyze"をクリックします。 2 Analysis Summary Analysis Summaryの"Basic Heap Information"には、ヒープサイズ、オブジェクト数、オブジェクトタイプ、Heapdump作成日時が表示されます。 System Technical Service Center | ISA-7 ISA MDD4Jの使い方 3/6 "High-level Summary of the Heap Contents"には、ヒープを占めるコンポーネントとオブジェクトタイプが円グラフで表示されます。 Customer.miscellaneousは、カスタマーのアプリケーション関係のオブジェクトを示します。 "HTML Report"をクリックすると、MDD4Jによる解析結果をHTMLに出力することができます。 3. Reach Size Leak Suspects "Reach Size Leak Suspects"には、MDD4Jがリークの疑いがあると判断したオブジェクトが表示されます。 Leaking Container Object Type: Leaking Containerのオブジェクトタイプ Leak Unit Object Type: Leak Unitのオブジェクトタイプ Number of Instances :インスタンス数 Heap Size of Leak Container:Leak Containerのヒープサイズ System Technical Service Center | ISA-7 ISA MDD4Jの使い方 4/6 表1. Leaking Container Object Type com.ibm.ws.session.store.memory.MemoryStore Leak Unit Object Type Number of Instances com.ibm.ws.session.store.memory.SessionSimpleHashMap 13 com.ibm.ws.session.store.memory.MemorySession java.util.Hashtable 2 Heap Size of Leak Container 219MB 219MB 赤枠のリンクをクリックすると、下記のようにLeak ContainerとLeak Unitの参照関係の図が表示されます。 四角のオブジェクトにマウスを合わせると、そのオブジェクトの詳細情報が表示されます。 4. Object Tables "Object Tables"では、オブジェクトタイプごとに、インスタンス数や配列インスタンス数がわかります。 "Instance Count"、"Array Instance Count"をクリックして、ソートすることもできます。 通常よりもインスタンス数の多いオブジェクトに着目するとよいでしょう。 5. Data Structures "Data Structures"には、ヒープ内の使用量のサマリーが表示されます。 Growing、Shrinking、Steadyは、複数のHeapdumpの比較です。リークの可能性のあるオペレーションの実行前後でHeapdumpを取得して、オブジェクトの増 え方を比較する際には有効です。 6. 資料解析 「4.ISA PDハンズオンの準備」で取得したheapdumpファイルをMDD4Jで開きます。 (今回のハンズオンでは、トラブルシューティングで作成したケース”OOM”で指定したheapdumpファイルを選択します。) System Technical Service Center | ISA-7 ISA MDD4Jの使い方 5/6 Analysis Summaryの"High-level Summary of the Heap Contents"では、Customer.miscellaneous(カスタマーのアプリケーションなど)で 220MBを占めていることがわかり、アプリケーションが原因であることが推測されます。 また、byte[]の配列で82.8%を占めていることなど、調査のヒントになりそうな情報もわかります。 "HTML Report"をクリックして出力した、AnalysisReport.html ファイルを別添しております。(IE以外のブラウザでうまく表示できない場合はIEを使用してくださ い) "Reach Size Leak Suspects"には以下のオブジェクトが表示されています。 com.ibm.ws.session というパッケージ名のオブジェクトは、セッションに関連するオブジェクトであり、 com.ibm.ws.session.store.memory.MemorySessionというのはWASで使用されるセッションオブジェクトの一 つです。 このことから、セッション・オブジェクト関連でヒープを大きく使用していることがわかります。 表1. Leaking Container Object Type com.ibm.ws.session.store.memory.MemoryStore Leak Unit Object Type Number Heap Size of of Leak Instances Container com.ibm.ws.session.store.memory.SessionSimpleHashMap 13 com.ibm.ws.session.store.memory.MemorySession java.util.Hashtable 2 219MB 219MB 赤枠のリンクをクリックすると、下記の図が表示されます。 これらの情報から、セッション・オブジェクトから参照されているMyVectorオブジェクトで、218MBのヒープが使われていることがわかります。 これまでに判明した観点からサンプルアプリケーションのコードを調査すると、サーブレットの中で、セッション・オブジェクトにMyVectorオブジェクトを格納している箇所が あり、そこでヒープを大きく使用する作りになっているという原因を特定できます。 int size = 1000000; int loop = 1000; try { size = Integer.parseInt(request.getParameter("size")); } catch (Exception e) {} try { loop = Integer.parseInt(request.getParameter("loop")); } catch (Exception e) {} MyVector v = new MyVector(); HttpSession session = request.getSession(); session.setAttribute("v", v); try { for(int i=0; i<loop; i++) { byte[] buf = new byte[size]; v.add(buf); } System Technical Service Center | ISA-7 ISA MDD4Jの使い方 6/6 out.println("<H1>Normal END</H1>"); } 「5.ISA ガイド付きトラブルシューターを用いた問題分析」の作業中で当資料を参照した場合には、戻って引き続き作業を進めてください。 まとめ この節ではMDD4Jを用いたHeapdump解析方法をご紹介しました。