CodeZine(コードジン)

特集ページ一覧

知らないなんてもったいない! 障害発生の原因を洗い出すOSSのJavaVM解析支援ツール「HeapStats」を使ってみよう

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/12/19 14:00

目次

スナップショットの読み込みと各種統計情報の表示

 スナップショットファイル(heapstats_snapshot.dat)を読み込む場合、「スナップショット」タブを開いて、収集ログ読み込みと同じように[ファイル選択]ボタンから読み込みたいスナップショットファイルを選択して開きます。

スナップショット読み込み前
スナップショット読み込み前

 

 選択したファイルを読み込むと、収集ログと同じように、次図のとおりファイル名(青点線枠)、スナップショットの期間(緑点線枠)が表示されます。期間選択で解析を行う期間を選択し、赤枠の[OK]ボタンをクリックします。

スナップショット読み込み後
スナップショット読み込み後

 

 しばらくするとアナライザによる描画処理が完了し、選択した期間のスナップショットの各種統計情報が、以下で説明するタブに分けられてグラフィカルに表示されます。

 

統計情報表示タブ

 「統計情報表示」タブには、選択した期間内の以下の情報が表示されます。ここで、期間内のヒープやメタスペース[3]に異常がないかを確認します。

統計情報表示
統計情報表示

 

 それぞれ以下のような情報をグラフで表示しています。

統計チャート
  • Total Heap Size(KB):総ヒープサイズ(キロバイト)
  • New Heap Usage(KB):New領域の使用量(キロバイト)
  • Old Heap Usage(KB):Old領域の使用量(キロバイト)
  • GC Time(msec):GC処理時間(ミリ秒)
メタスペースチャート
  • Metaspace Capacity(KB):総メタスペース[3]サイズ(キロバイト)
  • Metaspace Usage(KB):メタスペース[3]の使用量(キロバイト)
サマリー
  • SnapShot回数 期間内スナップショット取得回数
  • GC回数 ガーベジコレクションの発生回数。総数と、FullGC、YoungGCの回数をそれぞれ表示する
  • 最新ヒープ使用量 最後のスナップショットの時点でのヒープ使用量(キロバイト)
  • 最大GC時間 期間内で最も処理時間が長かったGCの処理時間(ミリ秒)
  • 最小GC時間 期間内で最も処理時間が短かったGCの処理時間(ミリ秒)

 先ほどの画面から、どのような状況だと判断すべきでしょうか? メタスペースチャートを見ると、メタスペースは使用量が安定して推移しています。しかし、統計チャートを見ると、ヒープはOld領域の使用量が増加傾向にあります。このことから、監視しているJavaアプリケーションは、ヒープのメモリリークを起こしている可能性が高いことが分かります。

[3] HeapStats 1.1から導入されました。OpenJDK 7、またはJava SE 7以前の場合は、パーマネント領域の情報が表示されます。

 

差分表示タブ

 「差分表示」タブには、選択した期間のヒープ使用量の差分と使用量のランキングが表示されます。ここでは、どのようなオブジェクト(クラス)がヒープを占有しているのか、また、どのように増減しているかを時系列で確認します。

差分表示
差分表示

 

 「差分ランクチャート」には、スナップショット2点間のヒープ使用量の差分が、多い順にランキング表示されます。

 「ヒープ使用量チャート」には、オブジェクト別のヒープ使用量が積み上げグラフで表示されます。ヒープ使用量はランキング上位のオブジェクトと、それ以外のオブジェクトに分けて表示されます。

 これらのチャートは、ラベルに「使用量」と表記されている場合にはヒープ使用量の多い順に表示され、「インスタンス」と表記されている場合にはインスタンス数の多い順に表示されます。この表示の切り替えは、「オブジェクト一覧」にあるトグルボタンによって行えます。

 「オブジェクト一覧」には、選択期間の最初と最後のスナップショットにあるオブジェクトが、ヒープ使用量の差分で多い順に表示されます。表の最左列のカラーは、差分ランクチャートやヒープ使用量チャートのカラーとリンクしています。

 先ほどの統計情報表示タブからは、監視対象のJavaアプリケーションはメモリリークを起こしていることが判明しましたが、具体的にどのオブジェクトがリークの原因となっているかまでは判明しませんでした。そこで、この差分表示タブのヒープ使用量チャートを確認します。すると、青色のオブジェクトが増加傾向であることが一目で分かります。さらにオブジェクト一覧を見ると、リークの原因となっているオブジェクトは「[B」、すなわちbyte型の配列であると分かります。

 

スナップショット表示タブ

 「スナップショット表示」タブには、指定した時点のスナップショットの情報が表示されます。特定のタイミングでの、各オブジェクトごとのヒープ使用率を確認するときに役に立ちます。

 初期表示時は、選択期間内の最古のものとなりますが、統計チャートや差分表示タブのヒープ使用量チャート、あるいは差分ランクチャートのグラフ部分をクリックすると、グラフ上に白の縦線が引かれ、スナップショット表示タブにその時点のスナップショット情報が表示されます。

スナップショット表示
スナップショット表示

 

 「スナップショット情報」に表示される項目とその内容は次表のとおりです。

スナップショット表示タブに表示される情報
項目 表示内容
日時 スナップショット日付(YYYYMMDD HH:MM:SS形式)
エントリー数 オブジェクト一覧のエントリー数
ヒープ使用量 合計ヒープ使用量
スナップショット理由 スナップショット取得理由
GC理由 GC発生理由

 

 「ヒープ使用量チャート」は、ヒープ使用量を円グラフで表示します。ランキング上位のオブジェクトとそれ以外のオブジェクトに分けてヒープ使用量の割合が表示されます。

 「オブジェクト一覧」は、スナップショット取得時にメモリにロードされているすべてのオブジェクトが表示されます。一覧の最左列のカラーは、ヒープ使用量チャートのカラーと同一のものが利用されています。

 

参照情報表示タブ

 「参照情報表示」タブは、HeapStats 1.1から導入されました。

 このタブでは、選択したオブジェクトを起点として、オブジェクトの参照関係が表示されます。これまでの「統計情報表示」などを利用した解析で、メモリ使用量が大きかったり、リークの傾向のある怪しいオブジェクトがあったときに、そのオブジェクトが他のオブジェクトとどのような参照関係を持っているかを、素早く確認することができます。

 今回の例の場合、先ほどの差分表示タブで、byte型の配列がメモリリークの原因であることが判明しました。Javaアプリケーションのソースコードからbyte型の配列を生成する箇所を調べることで、メモリリーク原因を追究することが可能ですが、ソースコードが膨大な場合、調査にも時間がかかります。そこでこの参照情報表示タブにより、byte型の配列の参照関係を見てみましょう。

 起点となるオブジェクトを選択するには、差分表示タブやスナップショット表示タブのオブジェクトリストをダブルクリックします。これにより、参照情報表示タブに赤楕円のオブジェクトが表示されます。差分表示タブで選択した場合、選択情報で選択した期間の最新のスナップショット収集時刻で表示され、スナップショット表示タブで選択した場合、現在表示中のスナップショット収集時刻で表示されます。

参照情報表示(基点)
参照情報表示(基点)

 

 参照オブジェクトは親または、子方向への参照方向、インスタンス数、使用量でのソート、ソート結果の上位のみ表示が設定可能です。表示するランキング数は、プロパティファイルで設定します。

 各オブジェクト間の線上にある数字は、上が参照インスタンス数を、下がメモリ使用量を示しています。この数字の上にマウスを乗せると、詳細な数値が表示されます。なお、参照インスタンス数は参照の数であり、インスタンス数そのものではないことに注意してください。複数の参照があればその分カウントされ、実際のインスタンス数より多くなります。このため、参照インスタンス数は絶対数ではなく比率に注目するのがポイントです。

参照情報表示(展開)
参照情報表示(展開)

 

 この参照情報表示のグラフは、byte型の配列を基点に選び、特に使用量の大きいオブジェクトの参照関係を調べた結果です。byte型の配列からの参照関係を確認した結果、赤線で囲まれたAirクラスが他オブジェクトと比較して多くの使用量(221,233KB)を占めていることが分かりました。このAirクラス、およびAirクラスと参照関係のあるクラスのソースコードを調査することで、メモリリークの原因を速やかに追究できます。

 

おわりに

 いかがでしたでしょうか? HeapStatsは一度導入してしまえば、Javaの起動オプションを1つ追加するだけで、後から色々な情報を確認することができるようになります。

 HeapStatsはIcedTeaコミュニティでOSSとして公開されています。興味を感じたら、メーリングリストにもぜひご参加ください。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 久保田 祐史(クボタ ユウジ)

    日本電信電話株式会社 OSSセンタ所属。OpenJDKを中心とした OSS製品のテクニカルサポートを担当。パフォーマンス劣化からコア解析までなんでもござれの火消し役。 IcedTea Committer. JavaOne2014 Speaker. HeapStatsやJVMについて発表したりし...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5