あだまる日記

とあるインフラエンジニアの日記です。皆さんのお役に立てるよう頑張ります。

JVMパラメータ (メモリの話)

Tomcatの設定が必要とのことで、JVMについて調べてみた。

TomcatJVMパラメータを設定するまでの道のりを記載する。

(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領域

 

JVMGCにおける動き

  1. Newする→Edenに入る。
  2. Edenが一杯になる→〜GCにより、使用中のオブジェクトはFromに入る。Edenは空になる。
  3. Newする。→Edenに入る。
  4. Edenが一杯になる→〜GCにより、使用中のオブジェクトはToに入る。Fromに入ってたやつもToに入る。
  5. 1.~4.を繰り返して、FromかToが一杯になる→〜GCによりFrom(To)のオブジェクトはOld領域に入る。
  6. 1.~5.を繰り返してOld領域が一杯になる→Full GC により、ヒープ全体で使ってないものを大掃除する。(→これは、サービス提供時間になるべくやりたくない)

という感じ。Full GCは明示的に起こすこともできるので、毎日深夜にってこともできるらしい。

 

TomcatJVMパラメータを設定する。

startup.bat中に呼び出されるcatalina.bat内の最初にCATALINA_OPTSにJVMパラメータを設定する。

JAVA_OPTSでも良いが、起動時も停止時もデバックモード起動時もそのオプションが有効になってしまうので注意が必要。

起動中のみの設定であれば、catalina_optsに設定

 

weblogicJVMパラメータを設定する。

これもTomcatと同じで、startup.sh,startup.bat中に呼び出されるスクリプト中に

WLS_OPTSっぽいものがあったはず。

JAVA_OPTSでもいいけど。。。

 

指定の仕方は他のブログに情報があるので見てみてください。

-xmx -xss maxPermsizeとかそんな綴りです。