- PR -

TOMCATとメモリの関係。。。

投稿者投稿内容
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-09-06 01:20
こんばんわ。
現在、apache1.3.28+tomcat4.1.24+Linuxでサイトを運用しております。

常にターミナルから top コマンドでメモリの値を参照していて、
メモリのことで気になることがあります。

tomcatそのものをを再起動した場合、
メモリは綺麗にクリアされているのですが、
Contextをリロードした場合、全くメモリがクリアされません。

例えば、現在TOMCATが200M使っている状態で
Contextをリロードすると、198Mくらいの微妙な数値になります。
その後、Servletにアクセスするとクラスローダによって、
クラスがメモリに読み込まれているようなので使用メモリがどんどん増えていきます。
ContextListenerには contextDestroyed() メソッド内に
System.gc();
と記述し、さらに jvm へのパラメータには -Xincgc を付与しています。

皆様はこのような現象に出くわしたことないでしょうか。
理想は、リロード時に強制GCされメモリクリーニングが行われるべきなのですが。
仕様ですかね・・?tt

OutOfMemoryを待つしかないのか!

[ メッセージ編集済み 編集者: raystar 編集日時 2003-09-06 01:22 ]
ウラタン
常連さん
会議室デビュー日: 2003/07/25
投稿数: 29
投稿日時: 2003-09-10 11:07
内部挙動のことなので確実に言える部分が少ないのですが、GCって、
コーディングしてもその時に動作することは保障されないような気が
します。

Destroyとかも含め、全てJVM任せになってしまうような。
試しに、contextDestroyedメソッド内のSystem.gc()の直前にPrint
でもしてみてはいかがでしょうか?
なんとなく、1回ずつ呼ばれてないんじゃないかな?、と思えます。
(呼ばれても、GCがそこで動くかどうかわからないですが)

自分も、ちゃんとメモリ解放しようとして、思い通りに動かなかった
記憶があります。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-09-10 19:53
レスありがとうございます。

Sysmte.gc()はGCは実行保証されないということは
わかっていることでした。

では、例えばどのようなタイミングでGCが作動するのでしょうか。
GCのキーはJVMオプションかと思い、以下のように設定しております。

OS : RedHat Linux 7.3
Tomcat : 4.1.24
java : 1.4.2
Memory : 1.5GB
Dual CPU

java -server -XX:+ParalellGC -Xms1250M -Xmx1250M -XX:NewSize 128M -XX:MaxNewSize 128M

としております。
まだ、上記の設定にしてからOutOfMemoryが発生していないので
確かかどうかわからないですが。。。
ウラタン
常連さん
会議室デビュー日: 2003/07/25
投稿数: 29
投稿日時: 2003-09-11 19:56
お疲れさまです。

>では、例えばどのようなタイミングでGCが作動するのでしょうか。

わかりません(汗;; 申し訳ない。
自分は、hp-uxとWin2KでHxxxxxx製のものを使ったのですが、どうも、
一定時間毎に条件付きでgcしているようでした。(5〜10秒程度)
jvmの実装によっても違いそうですね・・・
オブジェクトの参照がなくなれば、とありますが、それってどうやって
判断してるんだろう、などと不思議に思っています。

自分も、割り当てメモリを増やして対応しました。
これでダメなら、WebサーバーとAPサーバーの同時セッション数を
絞るつもりです。

解決にならん答えですみません。
願わくば、お互い、お客さんに呼び出されませんよう・・・
がんばってください。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-09-11 20:20
>常にターミナルから top コマンドでメモリの値を参照していて、
topコマンドで測れるのは空き領域も含めたメモリ消費では?
Java内部でどれだけのインスタンスが生きていて,どれだけ再利用
されてるかはJavaVM内部の問題で外部からは見えないはず.

>ContextListenerには contextDestroyed() メソッド内に
>System.gc();
>と記述し、さらに jvm へのパラメータには -Xincgc を付与しています。
これは無意味ですからやめたほうがいいです.
#これも初心者向けFAQだなあ....
http://www.netgene.co.jp/java/technicalTerms.html#GCSystemGc
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-09-12 00:57
ウラタンさんへ

レスありがとうございます。
Apache1.3.28+Tomcat+mod_jkの運用で、
テスト気をTomcat単体稼動(TomcatのHTTPサーバ)にしたところ、
java プロセスのメモリが少なくなりました。

まったく意味不明ですが、、、、
一時的な解決かな・・・


悪夢を統べるものさん

レスありがとうございます。
SUNのドキュメントを読み返したところ、
System.gc()は呼ぶべきでないということがわかりました。
さらに System.gc() を禁止するオプションもあるそうで。。。

JVMの内部を知るにはやはり商用オプティマイザが必要かな・・・
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-09-12 08:28
unibon です。こんにちわ。

引用:

raystarさんの書き込み (2003-09-10 19:53) より:
java -server -XX:+ParalellGC -Xms1250M -Xmx1250M -XX:NewSize 128M -XX:MaxNewSize 128M


目的は、OutOfMemoryError が出ることを抑止したいのでしょうか、
それとも、パフォーマンスチューニング(速度やメモリ消費量)でしょうか。
私は Linux や Tomcat は良く知らないのですが、
現在の Java VM の多くは、OS から一度確保してしまったメモリを手放すことは
あまり積極的にしないか、あるいは全然しないと思います。

単に、アプリケーションや Tomcat や VM のメモリリークかどうかを心配されていて
(さらに将来 OutOfMemoryError が出ることを恐れられている)のならば、
-XmsM や -Xmx の値をかなり小さ目にして、
それで OutOfMemoryError が出るかを調べられれば良いです。
出なければ、パフォーマンスチューニングの問題だけになります
(少なくともメモリリークはなく、ロジックの問題はない)。
さらには java の起動時オプションで
-verbose:gc
を付けてその変化を見ると安心できます。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-09-12 08:51
引用:

Apache1.3.28+Tomcat+mod_jkの運用で、
テスト気をTomcat単体稼動(TomcatのHTTPサーバ)にしたところ、
java プロセスのメモリが少なくなりました。


おはようございます。
この件でメモリー使用量と仰っているのは、TopコマンドのJavaプロセスのRESについて
ということで、よろしいでしょうか?
この値は、例えばJSPのトランスレート・コンパイルなんか行うと「ガバッ」と倍ぐらい
に膨れ上がって、そのまま減ることがないことを経験しています。
アプリケーションの入れ替えを何回も行うことで飛躍的にメモリー使用量が増えて
いるのではないでしょうか??

# 追記です。
# 恐らくトランスレータおよびコンパイラを使った後メモリー使用量が減少しないのは
# 2度目以降の処理速度を上げるために、これらがメモリーに常駐しているのでは?と
# 考えることもできます。よって、Tomcat+JVMが本当に必要とするメモリーサイズは、
# これらの操作後の値と解釈することができるかもしれません。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-09-12 15:30 ]

スキルアップ/キャリアアップ(JOB@IT)