ども、かっぱです。
はじめに
参考
- http://www.whitemark.co.jp/tec/java/javaHeap.html
- http://www.whitemark.co.jp/tec/java/javagc.html
- http://d.hatena.ne.jp/ogin_s57/20120623/1340463194
- http://d.hatena.ne.jp/ogin_s57/20120709/1341836704
- https://docs.oracle.com/javase/jp/1.5.0/guide/management/agent.html
- http://chonaso.hatenablog.com/entry/20140507/1399395305
- http://www.slideboom.com/presentations/800440/20130727-%E6%B8%8B%E8%B0%B7Java-%232-Java%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%90-%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E3%81%AE%E7%9B%A3%E8%A6%96
上記の全ての記事がとても参考になった(というかむしろそのまま内容を拝借した感じになっている...)投稿者、作者の皆様に感謝。
JVM の構成
構成
以下のようなイメージ。
ヒープ領域
- Java が利用出来るメモリ領域
非ヒープ領域
- Permanent 領域
New 領域
- Eden : 最初にインスタンス化したオブジェクトが格納される
- From : Scanvage GC によってオブジェクトが格納される
- To : Scanvage GC によってオブジェクトが格納される
Old 領域
- New 領域の From と To のやりとり頻度が多い(Defaul 32 回)オブジェクトで利用される
- 空き領域が少なくなると Full GC によってオブジェクトは破棄される
Parament 領域
- アプリケーションのクラス、メソッドが格納される
- 大量のクラスや JSP を大量に利用する場合には領域を大きく確保しておく必要がある
- Old 領域同様に空き領域が少なくなると Full GC により空き領域を確保する
GC
ガーベージコレクション
以下のようなイメージ。
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領域 の空き容量が回復しない状態」
(以下、引続き書く)