Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

javaメモリリーク

javaで作成されたwebアプリケーションで
1回大量の処理をするとその後しばらく大量の処理が
できなくなります。

1回は正常に処理を終了できるということは
メモリリークが考えられるのですが
翌日にも影響が出ることがあり、
夜中誰も使わなければさすがにガベージコレクションが処理されますよね?

なぜ翌日に影響が出るのでしょう?

1ページだけCでできているのでCも怪しいのですが・・・

6

回答

5480

閲覧

6件の回答

評価

0

>1ページだけCでできているのでCも怪しいのですが・・・
それは先に切り分けなきゃだめだろ。

>さすがにガベージコレクションが処理されますよね?
ガベージコレクションの処理対象ならね。

評価

0

そういえば
大量の処理を連続ではできないですが
少量の処理を連続してたくさんしても問題ないんですよ

(例)200件の処理を100件×2回はできないけど20件×10回ならできる
  100件×1回+20件×5回もできる

メモリリークなら少量の処理も蓄積されてしまうはずですよね?
ということはメモリリークではなく
メモリ関係の別の原因?

評価

0

夜中に誰も使わないなら
再起動しちゃえば?

よくあるオチとしては
StreamやConnectionをクローズしていないとか

評価

0

処理に使ったデータが、クリアされないままクラス変数に格納してある、とか。

評価

0

・JVMで良く使われているガベージコレクションの仕組み
----------------------------------------------------------------------
Javaのメモリ領域は高速gc領域(容量小)と、低速gc領域(容量大)に分けられています。

プログラム中からメモリ確保が発生すると、まず高速gc領域にメモリ確保が行われます。

高速gc領域がいっぱいになった時、高速gc領域内で、高速gcが実行されます。

この時、高速gc領域内に、まだ使用中のメモリ領域があれば、使用中メモリ領
域は長期間使用される領域だろうと推測され、メモリ寿命に+1されます。

高速gc実行時に、メモリ寿命が一定数を超えるような長寿命な領域が見つかれば、
この使用メモリを、低速gc領域内に移動します。

低速gc領域がいっぱいになった時、フルガベージコレクションが実行されます。
----------------------------------------------------------------------

ですから、
> 夜中誰も使わなければさすがにガベージコレクションが処理されますよね?
と言う事にはならないと思われます。

夜中誰も使わない事がわかっているなら、
夜間バッチにて、ガベージコレクションを実行してみてはどうでしょうか。

●補足
・JVMの起動オプションでgcの設定が出来る環境もあるみたい。
・JVMの起動オプションでgcのイベントログを出力したりも出来るみたい。

評価

0

>やんちさん
おお!丁寧な解説をしていただきありがとうございます!

なるほど、やはりいつまでも使用中として残ってしまっている
メモリが日をまたいでも居座り続けているわけですね・・・

>>夜間バッチにて、ガベージコレクションを実行してみてはどうでしょうか。
そのような手があったのですか、プログラム修正での解決策がもしどうしても
みつからなかった場合は最終手段としてやってみます。

netbeansのプロファイラでメモリを解析していると
確かに例の処理を実行するごとにライブバイト数が増えていくのですが
スナップショットを作成してみるとガベージコレクションが実行されてしまうのか
ライブバイト数が急激に減少した状態での解析になってしまい
メモリリーク調査の参考にしにくい・・・
プロファイラ使ってもメモリリークの箇所をみつけるのは困難ですね・・・

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。