2017年2月11日土曜日

JVM入門

Schooの授業メモ
Apache Tomcatチューニング入門


メモ

Java/Tomcatアプリのレスポンスのボトルネック
keep-aliveの見直し、DB設計、SQL見直し
インデックスの見直し、Tomcatのメモリ設定

TomcatもJavaプログラム
知らなかったです。
TomcatもJavaプログラムのため、
物理メモリ → JVM → Tomcat → Webアプリ
という関係性のイメージになる

JVMの仮想メモリ
スタック領域 + ヒープ領域

スタック領域
参照型変数のアドレス参照とプリミティブ型変数を格納する

ヒープ領域
オブジェクトのインスタンスを格納する
実行速度に特に影響が出やすいのが、このヒープ領域

さらにEden領域・Survivor領域・Tenured領域に区切られる。
Eden領域 + Survivor領域 = New領域
Tenured領域 = Old領域ともいう。

Survivor領域については、From空間とTo空間
(Survivor0 / Survivor1)にさらに別れる。

Garbage Collectionの動き
インスタンスを生成して最初に格納されるのが、ヒープ領域のうちのEden領域
Eden領域がいっぱいになると、Scavenge GC(Minor GC)が起動する。
参照されていないインスタンスは破棄し、残りは
Survivor領域のTo空間(Survivor1)に移動する

その後のScavenge GCにおいて、参照されているTo空間のインスタンスは、
From空間(Survivor0)に移動する

デフォルトでは、16回マイナーGCを実行されたインスタンスは、
Tenured領域に移動します。
new領域とOld領域が一杯になるとFull GC(Major GC)が実行され、
一時的にアプリが停止します。
以上のように、GCの対象になるかどうかは参照があるかどうかですが、
GCが実行されるタイミングは、メモリ容量によって決まります。

JVMのプロセスを表示
JVMのプロセスを表示
$ jps
3528 Jps
2554 
3403 Bootstrap
2188 

-vをつけると、実行コマンドを確認できる
$ jps -v
3529 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home 
-Xms8m
2554  -javaagent:../Eclipse/lombok.jar -Dosgi.requiredJavaVersion=1.8 -Xms40m 

JVMプロセスのメモリ使用状況
jstat -gcutil  3403
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  68.59  90.99  38.86  96.71  92.41      9    0.121     1    0.059    0.180
FGCがFull GCが発生した回数
FGCが発生していた時間

単発は問題ない(メモリを解放するので悪いことではない)が、
頻発しているとアプリが止まっているので、問題がある
項目の詳細は公式から
  • S0 : Survivor0の使用率
  • S1 : Survivor1の使用率
  • E : Eden領域の使用率
  • O : Old領域の使用率
  • P : Permanent領域(Tenured領域の別名)の使用率
  • M : メタスペースの使用率
  • CCS : 圧縮したクラス領域の使用率
  • YGC : マイナーGCの回数
  • YGCT : マイナーGCの時間
マイナーGC = Young GCの理解ですが、時間があったら確認したい。

Stop The world
Full GCにより一時的にアプリが停止すること(スレッドの停止)

OutOfMemmoryError
Full GCでもメモリ不足が解消できない状態

指定メモリが大きすぎるのも問題
メモリ・CPU・アプリケーションの性能により、
単純にメモリを大きくすれば良いという話ではないらしい。
  • マイナーGCに時間がかかる:New領域が大きすぎる
  • フルGCに時間がかかる:Old領域が大きすぎる

JVMの起動時の設定
  • -Xms:ヒープ領域の起動時のサイズ
  • -Xmx:ヒープ領域の最大サイズ
  • -XX:NewSize:New領域のサイズ
  • -XX:MaxSize:New領域の最大サイズ
  • -XX:SurvivorRatio:From/To領域の使用比率
  • -XX:MaxTenuringThreshold:New領域からOld領域に移動する閾値
  • -XX:TargetSurvivorRatio:Survivor領域の閾値

起動オブションの設定
・引数で渡す
・設定ファイルに書いておく(setenv.sh/setenv.bat)

0 件のコメント:

コメントを投稿