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プロセスのメモリ使用状況
-
FGCがFull GCが発生した回数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が発生していた時間
単発は問題ない(メモリを解放するので悪いことではない)が、
頻発しているとアプリが止まっているので、問題がある
項目の詳細は公式から- S0 : Survivor0の使用率
- S1 : Survivor1の使用率
- E : Eden領域の使用率
- O : Old領域の使用率
- P : Permanent領域(Tenured領域の別名)の使用率
- M : メタスペースの使用率
- CCS : 圧縮したクラス領域の使用率
- YGC : マイナーGCの回数
- YGCT : マイナー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 件のコメント:
コメントを投稿