Javaサーバサイドプロファイリング 2

ヒープの確認

ヒープの確認

ここでは、「メモリー(ヒープ)」タブを表示させてみます。下のスクロールバーで過去の時間のデータを参照したり、左上にある虫眼鏡ボタンでグラフの拡大/縮小を行うことができます。

それでは、スクロールバーを左に移動させ、起動直後のヒープの動きを見てみましょう。


メモリー(ヒープ)ビュー
図2:メモリー(ヒープ)ビュー
(画像をクリックすると別ウィンドウに拡大図を表示します)

グラフを見ると、ヒープサイズが徐々に大きくなっていることがわかります。これはJavaVMが自動的にヒープを割り当てていることを意味します。 アプリケーションの起動や、たまに処理が遅くなる場合は、ヒープメモリの自動割り当て処理が動いている可能性があります。アプリケーションサーバに割り当 てるメモリのサイズが決まっている場合は、ヒープサイズの下限と上限をそのサイズに指定しておくと良いでしょう。

使用済みヒープの確認

次に、ペットストアのアプリケーションにWebブラウザからアクセスしてみましょう。URLは「第1回:プロファイラとは」で解説したように、以下の通りになります。



http://サーバのIPアドレス/jpetstore/

   さて、Webブラウザからアプリケーションにアクセスしたとき、NetBeans Profilerの画面はどのように表示されるでしょうか。


Webブラウザでアクセス中のメモリー(ヒープ)ビュー
図3:Webブラウザでアクセス中のメモリー(ヒープ)ビュー
(画像をクリックすると別ウィンドウに拡大図を表示します)

少し使用済みヒープが増えたようにみえます。しかし、単調増加ではなく、増えたり減ったりしているようです。ヒープが増えているのは、アプリケーションがオブジェクトを生成したためで、ヒープが減っているのはGCが発生してJavaVMが不要なオブジェクトをヒープから削除しているためです。

ここで、グラフが以下の図4のようになったとします。


メモリリーク中のメモリー(ヒープ)ビュー
図4:メモリリーク中のメモリー(ヒープ)ビュー
(画像をクリックすると別ウィンドウに拡大図を表示します)

これはGCが発生しているのにもかかわらず、使用済みヒープサイズがなかなか減っていない状況です。なぜなら、ヒープから削除してもよいとJavaVMが判断できるオブジェクトがないためです。

GCについては、「メモリー(GC)」タブも併せて参照するとよいでしょう。「メモリー(GC)」や「メモリー(ヒープ)」画面を表示させたときに以下のような状態であれば、アプリケーションの実装やサーバの設定を見直す必要があります。


  • 生存中世代が一方的に増えている
  • 相対GC時間が一方的に増えている
  • GCが発生しているのに使用済みヒープサイズが小さくならない
表2:設定を見直すべき状況

具体的には、以下のような対策が考えられます。


  • ヒープサイズを増やす
  • 巨大なオブジェクトをメモリに保持していないか確認する
  • メモリを無駄使いしているオブジェクトがないか調査する
表3:とるべき対策

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る