JVMパラメータ (メモリの話)
Tomcatの設定が必要とのことで、JVMについて調べてみた。
TomcatにJVMパラメータを設定するまでの道のりを記載する。
(WLSでも同様の検討で足りるはず。
この記事の概要
メモリについて簡単に分類する。
Tomcat(またはWebLogic)にJVMパラメータを設定する。
メモリについての初歩的な知識
そもそもOSのメモリってといったところはすっ飛ばす。
JAVAのメモリの話。
C言語だと、メモリの解放はプログラミングで明示的に制御するけど、
Javaだとガベージコレクション(GC)という機能があるから制御しない。
(制御できないのか、制御しないのかその辺りは不明)
ここからグーグル先生から教わった内容
javaのメモリに関する分類
・ヒープ
┗ New領域:
Eden領域:新しいオブジェクトを格納する領域
From (To) 領域:Eden領域が一杯になったときに〜GCによって使用中の
オブジェクトが格納される領域
┗ Old領域:Newがいっぱいになったときに〜GCによって格納される領域
┗ Permanent領域:永続的に利用される領域(class構造など)
・Cヒープ?
・スレッドスタック:ローカル変数など
サイズを簡単に見積もる
ヒープ全体は、OS全体のメモリからOSやその他のアプリが使うメモリ+αを差し引けば良い。(OSメモリの半分にしてみる。)
Permanent領域は、classやらjarやらTomcatやWLSのインストール配下の
ディレクトリ内を漁ればわかる。(256mあれば十分?)
あとは決めなければ行けないのは、
Newどれくらい? Edenどれくらい? てこと。
ヒープ − Permanent領域= New領域+Old領域 = Eden+From(To)+Old領域
JVMのGCにおける動き
- Newする→Edenに入る。
- Edenが一杯になる→〜GCにより、使用中のオブジェクトはFromに入る。Edenは空になる。
- Newする。→Edenに入る。
- Edenが一杯になる→〜GCにより、使用中のオブジェクトはToに入る。Fromに入ってたやつもToに入る。
- 1.~4.を繰り返して、FromかToが一杯になる→〜GCによりFrom(To)のオブジェクトはOld領域に入る。
- 1.~5.を繰り返してOld領域が一杯になる→Full GC により、ヒープ全体で使ってないものを大掃除する。(→これは、サービス提供時間になるべくやりたくない)
という感じ。Full GCは明示的に起こすこともできるので、毎日深夜にってこともできるらしい。
TomcatでJVMパラメータを設定する。
startup.bat中に呼び出されるcatalina.bat内の最初にCATALINA_OPTSにJVMパラメータを設定する。
JAVA_OPTSでも良いが、起動時も停止時もデバックモード起動時もそのオプションが有効になってしまうので注意が必要。
起動中のみの設定であれば、catalina_optsに設定
weblogic でJVMパラメータを設定する。
これもTomcatと同じで、startup.sh,startup.bat中に呼び出されるスクリプト中に
WLS_OPTSっぽいものがあったはず。
JAVA_OPTSでもいいけど。。。
指定の仕方は他のブログに情報があるので見てみてください。
-xmx -xss maxPermsizeとかそんな綴りです。