読者です 読者をやめる 読者になる 読者になる

JRuby on RailsでのOutOfMemoryError

OutOfMemoryErrorが発生する件は、単純にTomcatのメモリの設定を変更した(Maximum memory pool -> 256MB)ところ解消されました。

JRubyRailsを動かす場合、Railsランタイムがプールされブラウザからのリクエストはそのランタイムによって処理されます。そしてリクエストが集中すると新しいランタイムが生成されます。今回のケースでも、、
Extからの同時リクエスト
 → Railsランタイムの生成
 → メモリ枯渇
という状況になっていたようです。

warを生成する前であれば、warble.rbの"config.webxml.jruby.max.runtimes"、warのディプロイ後にはweb.xmlの"jruby.max.runtimes"で最大のランタイム数を制限できるので、メモリを消費したくない場合には、ここを少なめにしておいた方がよさそうで(特に本番環境で動かす場合)。と、warble.rbのコメントにありました。warble.rbでは、"config.webxml.jruby.min.runtimes = 2"または"4"という記述があるので、この辺が目安でしょうか。

jruby.max.runtimesが、"1"の場合と"2"の場合で数十MBくらいTomcatの消費するメモリ量が変わってました。

初回アクセス時に結構時間がかかるのもランタイムの生成のためのようです。その後、ランタイムが追加されている(と思われる)状況で、一気にCPU使用率があがり一時的にレスポンスが悪化しました。

ただ、私はJRubyは今回初めてさわった程度の人間なので↑に書いたことは間違っているかもしれません。間違った点があればご指摘くださいませ。