質問: javaで作成されたwebアプリケーションで 1回大量の処理をするとその後しばらく大量の処理が できなくなります。 1回は正常に処理を終了できるということは メモリリークが考えられるのですが 翌日にも影響が出ることがあり、 夜中誰も使わなければさすがにガベージコレクションが処理されますよね? なぜ翌日に影響が出るのでしょう? 1ページだけCでできているのでCも怪しいのですが・・・
回答: ・JVMで良く使われているガベージコレクションの仕組み ---------------------------------------------------------------------- Javaのメモリ領域は高速gc領域(容量小)と、低速gc領域(容量大)に分けられています。 プログラム中からメモリ確保が発生すると、まず高速gc領域にメモリ確保が行われます。 高速gc領域がいっぱいになった時、高速gc領域内で、高速gcが実行されます。 この時、高速gc領域内に、まだ使用中のメモリ領域があれば、使用中メモリ領 域は長期間使用される領域だろうと推測され、メモリ寿命に+1されます。 高速gc実行時に、メモリ寿命が一定数を超えるような長寿命な領域が見つかれば、 この使用メモリを、低速gc領域内に移動します。 低速gc領域がいっぱいになった時、フルガベージコレクションが実行されます。 ---------------------------------------------------------------------- ですから、 > 夜中誰も使わなければさすがにガベージコレクションが処理されますよね? と言う事にはならないと思われます。 夜中誰も使わない事がわかっているなら、 夜間バッチにて、ガベージコレクションを実行してみてはどうでしょうか。 ●補足 ・JVMの起動オプションでgcの設定が出来る環境もあるみたい。 ・JVMの起動オプションでgcのイベントログを出力したりも出来るみたい。