ようへいの日々精進 XP

一日イチネタ

ふわっと JVM のヒープ領域監視について考える

ども、かっぱです。

はじめに

  • Java アプリケーションを運用する上では避けて通れないであろうヒープ領域の監視についてフワッと考えてみた
  • JVM には幾つか領域があるがヒープ領域に焦点を当てる

参考

上記の全ての記事がとても参考になった(というかむしろそのまま内容を拝借した感じになっている...)投稿者、作者の皆様に感謝。


JVM の構成

構成

以下のようなイメージ。

f:id:inokara:20150328171523p:plain

ヒープ領域

  • Java が利用出来るメモリ領域

非ヒープ領域

  • Permanent 領域

New 領域

  • Eden : 最初にインスタンス化したオブジェクトが格納される
  • From : Scanvage GC によってオブジェクトが格納される
  • To : Scanvage GC によってオブジェクトが格納される

Old 領域

  • New 領域の From と To のやりとり頻度が多い(Defaul 32 回)オブジェクトで利用される
  • 空き領域が少なくなると Full GC によってオブジェクトは破棄される

Parament 領域

  • アプリケーションのクラス、メソッドが格納される
  • 大量のクラスや JSP を大量に利用する場合には領域を大きく確保しておく必要がある
  • Old 領域同様に空き領域が少なくなると Full GC により空き領域を確保する

GC

ガーベージコレクション

以下のようなイメージ。

f:id:inokara:20150328171541p:plain

New 領域における Scanvage GC について

  • Eden 領域が一杯になると Scanvage GC が実行されオブジェクトは To 領域へ移動して Eden 領域の空き容量を確保
  • 再び Eden 領域が一杯になり Scanvage GC が実行されるとオブジェクトは To 領域へ移動、To 領域のオブジェクトは From 領域に移動
  • From と To でオブジェクトの行き来が発生するが、この行き来が 32 回を超えると Old 領域にオブジェクトは移動する(MaxTenuringThreshold)
  • 比較的短時間で終了する

Old 領域における Full GC について

  • 主に Old 領域と Perament 領域を対象とした GC となる(New 領域でも発生する)
  • Scanvage GC 及び Old 領域、Perament 領域を対象とする GC の為に処理時間が長い
  • Full GC 実行中はシステム停止となってしまう...

監視項目(どこを見ておくべきなのか(何を主に見ておくべきなのか))

個人的な見解

  • 各領域(New / Old / Parament)の使用率
  • GC の回数(特に Full GC
  • New の Eden 領域
  • JVM に関係ないけどファイルのオープン数(Open Files Limits)
  • メモリリーク =「Full GC が発生しても Old領域 の空き容量が回復しない状態」

(以下、引続き書く)

各種ツール(監視ツール、解析ツール

jstat

JMX

ヒープダンプ、スレッドダンプ