2013-06-26 35 views
5

Tomcat(Warble)内で実行されているJRuby on Railsアプリケーションがあります。それは、Javaブリッジを使用してProgress(OpenEdge)アプリケーションサーバーに接続します...私がメモリを監視するとき、それは上昇し続けるだけです。Tomcat JRubyアプリケーションでメモリが解放されないのはなぜですか?

  • のTomcat 7.0
  • JRubyの1.6.7.2(ルビー-1.9.2-P312)
  • JVM 1.7.0.25
  • レール3.2.7
  • JRubyのラック1.1.7
  • ワーラー1.3.6

ここで問題を解決するにはどうすればよいですか?私はそれがクリーンアップされていないJRubyオブジェクト、またはJavaブリッジの何か、またはジョブを実行しないガベージコレクタかもしれないと思います...

私はプロセスを30分実行させてもメモリがダウンしない...

  • どのオブジェクトが生きているかを知る方法はありますか?
  • 誰もがすべてのメモリを使用していることについてより多くの情報を得ることができる、使いやすい無料のツールはありますか?

ちなみに、私はすでに多くのメモリを使用するようにTomcatサーバーを構成しているが、それはちょうど...

EDITをヒープ領域のエラーを遅らせています:私は実際に見ていると、Tomcatがちょうど使用していることです最大使用可能なすべてのメモリ(最大メモリプール)。それは決してそれを解放しない。おそらくそれはちょうど正常な動作です...私は今例えば最大256MBに設定しています。タスクマネージャでは、メモリは約256MBのままです。

EDIT:

ヒープ・ダンプを作成し、日食これは私が取得していたレポートであるEclipseのメモリアナライザでそれを分析させます。私は

問題の容疑者org.apache」によってロード「org.jruby.RubyClass」、の1つの

6.458インスタンス...ツールは、おそらく全体のJRubyの話を期待していないので、それは普通のことだと思います。 catalina.loader.WebappClassLoader @ 0x700ec6988 "は56.969.616(31,78%)バイトを占有します。

キーワード org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988 org.jruby.RubyClass

問題の容疑者org.jruby.internal.runtime.methods」の2つの

10.597インスタンス。 DefaultMethod "は、" org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988 "によってロードされ、22.182.112(12,37%)バイトを占めます。

キーワード org.jruby.internal.runtime.methods.DefaultMethod org.apache.catalina.loader。WebappClassLoader "0x700ec6988 @ org.apache.catalina.loader.WebappClassLoader" によってロード "org.jruby.RubyModule" の3つの

3.144の場合は、21.226.816(11,84を占め0x700ec6988

問題の容疑者@ %)バイト。

キーワード org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988 org.jruby.RubyModule

問題の容疑者」によってロード "org.jruby.MetaClass" の4つの

8.888の場合、 org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988 "は18.563.784(10,35%)バイトを占有します。

キーワード org.jruby.MetaClass org.apache.catalina.loader.WebappClassLoader 0x700ec6988

+0

具体的な問題は何ですか?あなたは記憶がなくなったのですか? JRubyのどのバージョン?どのバージョンのRails?その他 "3.7"はありません。 –

+0

具体的な問題は、ERROR Java Heap Spaceです。 ログに情報がありませんでした。 –

+0

質問をすべての特定のバージョンで更新します。 –

答えて

1

@これは、メモリリークのようにたくさんのにおいがします。かなり見えません。

多くのコードがない場合は、接続とストリーム、およびメソッドcloseを持つすべてのオブジェクトを閉じていることを最初に確認します。これが最近問題になった場合は、最後に変更されたコードを見てください。

私が試してみたいことは、some toolのコード検査です。

リークを早めるためのテスト(リクエストの生成など)を書いた場合、リークの原因となる領域が見つかるまで、アプリケーションからコードを除外することができます。

ゆっくりと苦しいプロセスであるため、メモリ内のオブジェクトの検査はお勧めしません。

1

まず最初に、256Mヒープスペースは、Javaアプリケーションの場合はあまり多くありません。特にサーブレットコンテナ/アプリケーションサーバーが充実しており、(おそらく)ライブラリがたくさんあるためです。

Javaは通常、オペレーティングシステムにメモリを戻しません。一度割り当てられると、メモリはJVMによって所有されていると見なされます。私はメモリを手渡すメモリ管理の実装がいくつかあると信じていますが、私はそれらを見たことがありません。とにかく-Xmxと同じ-Xmsを使用することをお勧めします(JVMがすぐに割り当てることができるすべてのメモリを割り当てます)

ヒープスペースが足りなくなったことは、2つ)条件:a)メモリリークのあるアプリケーションがあります。b)アプリケーションの要求に十分に割り当てられていません。

JVMのメモリ割り当てを増やし、メモリ使用量とガベージコレクションを監視してb)を排除する - アプリケーションに必要なメモリが十分にあると言うことができる場合は、a)を探し、メモリーリーク。それにはプロファイラを使うのが一番良いでしょうが、256Mのメモリでは、十分なメモリがないという大きなチャンスがあります。

関連する問題