2020.10.12

#11 Javaヒープ管理グラフのご提案

Out Of Memory事象の調査結果と、その後のJavaヒープ管理の事例

目次

開く

     

    ES/1 NEO CSシリーズを長年ご利用いただいているお客様から、WebSphereのJavaヒープ管理のためのグラフ設定をご依頼いただきました。管理対象のシステムでJavaのOut Of Memoryが発生してしまったために、対処したいということでした。
    今回は、Out Of Memory事象の調査結果と、その後のJavaヒープ管理の事例をご紹介します。

     

     

    Out Of Memoryが発生した日のJavaヒープ使用状況の確認

    1. ES/1 NEO CSシリーズのCS-Java for WebSphereオプションでは、時間毎のヒープメモリ使用量を取得しています。そこで、Out Of Memoryが発生した日のグラフを作成し、ヒープ使用状況を確認することにしました。

      その結果、ヒープ使用量が増加しているにもかかわらず、ヒープサイズが減少していることがわかりました(図1)。特に20時頃にその傾向はピークを迎え、ヒープ使用量がヒープサイズに到達してしまっています。なお、ヒープサイズはヒープ最大設定値に到達しておらず、余裕がある状況です。

    2.  

     

    11_1
    11_1

    図1 Javaヒープ使用量

     

     

    次に、OSメモリ使用量を確認しました。20時頃、OSメモリ使用量を示す「Memory Used」は増加していました(図2)。

    ユーザー・コマンド毎のメモリ使用量の内訳を確認すると、「root(java)」が使用していることがわかりました(図3)。

     

    なぜ、Javaにはヒープ上限値が設定されているにもかかわらず、ヒープ上限値を超えたメモリ使用量が報告されているのでしょうか。

    特に今回の事象ではJavaヒープサイズが減少傾向にあったにも関わらず、Javaコマンドのメモリ使用量は増加傾向にあります。

    理由は、Javaのメモリ管理の特徴にありました。


     

    11_2
    11_2

    図2 OSメモリ使用量

     

     

    11_2
    11_2

    図3 ユーザー・コマンド毎のメモリ使用量 ※Java以外のユーザー・コマンド名はマスクしています

     

     

    Javaの使用するメモリ領域

    1. Javaが使用する領域は大きく分けて2種類あります。JVM管理領域とOS管理領域です(図4)。
      JVM管理領域の場合、ヒープサイズの上限値を指定でき、その中でGCを発生させるなどして上限値を超えないようにJavaがメモリを管理します。一方、OS管理領域についてはOSが管理するネイティブメモリ上の領域に取られます。最近ではメタスペースについて上限が指定できるようになりましたが、基本的にOSが領域を獲得できれば上限はありません。

    2.  
    3.  

      今回の事象では、Javaコマンドの中でもOS管理領域のメモリ使用量が増加し、OSの空きメモリ量が減ったことで、ヒープサイズを拡張することができなかったことがOut Of Memoryの原因と考えられます。
      なお、OS管理領域のメモリ使用量の増加の原因については特定できませんでしたが、恐らく、入出力に使用されるCヒープ領域の増加が発生したと考えられます。理由は、該当時間帯、データベースアクセスを示すJDBC Pool毎のコネクション使用回数が増加していたためです(図5)。

    4.  

     

    11_4
    11_4

    図4Javaのヒープ管理

     

     

    11_5
    11_5

    図5 JDBC Pool毎のコネクション使用回数

     

     

    Javaのヒープ管理グラフのご提案

    1. 今回の事象を受けて、Javaヒープを定常的に管理するため図6のようなグラフを提案しました。JVMヒープ使用量の情報に、OS全体のメモリ使用量や、Javaコマンドのメモリ使用量を加えたグラフです。

      OS領域も同時に可視化することにより、ヒープ内の使用量だけでなく、OS管理領域のメタスペース、Cヒープ、スレッドスタックの増加についても気付きのきっかけになると考えられます。

     

     

    11_6
    11_6

    図6 JVMヒープ使用量(OS情報含む)

     

     

    また、詳細インターバルのグラフだけではなく、図7のような1日単位のサマリ情報を長期スパンでグラフ化することもご提案しました。
    長期グラフの場合には、最小ヒープ使用量を確認することで、GCにより解放されたあとのヒープ使用量を確認できると考えられます。もし、解放後ヒープ使用量が増加傾向にある場合には、GCでも解放されていない領域が増加している事象、いわゆる「メモリリーク」の気付きにつながります。

     

     

    11_7
    11_7

    図7 1日単位のサマリ情報グラフ

     

     

    4.まとめ

    JavaヒープのOut Of Memoryの予防には、Javaヒープ使用量だけでなく、OSメモリ使用量も確認する必要があります。

    本記事が皆様のパフォーマンス管理の一助となれば幸いです。


    執筆者

    N.T. 

    営業技術本部 技術サービス統括部 技術サービス1部 

    お客様担当SEとして、製品の構築から活用方法までの一連のサポートを担当
    また、お客様環境にて性能問題が発生した際には、製品のアウトプットを利用し、問題解決に向けた調査/提案業務を実施

    ■経歴
    2013年 入社
    2014年 品質管理部隊へ配属、10月からお客さまサポート部隊へ異動

    主にシステムリソース情報からの性能管理サポートに従事し、近年は、上記に加えAPM製品を利用したユーザー体感レスポンスやアプリケーション視点での性能管理サポートにも従事。現在に至る

    関連記事