2009-07-14 12 views
22

SpringのHibernateを使用して登録ユーザーのデータをOracleデータベースに永続化するWebアプリケーションがあります。アプリケーションは開発環境でうまく動作しますが、それよりも多くのデータでライブ環境にコピーすると失敗します。当初、アプリケーションは正常に起動しますが、「PermGen out of space」例外が発生したあと、いくつかのアクションが発生しました。Tomcat-Spring-Hibernate Webアプリケーションで 'PermGenが領域外で'例外の場合は何ができますか?

Google、Spring、およびHibernateフォーラムで検索を開始しましたが、それは役に立ちません。このエラーについて多くの議論がありますが、それぞれの解決策には、「それは働いています」と言っている人がいて、「それはありません」と言う人もいます。

たとえば、多くの人が-XX:MaxPermSize JVMパラメータを増やすことを提案しています。 javassistライブラリなどの使用上の問題とcglibライブラリを使用する必要があるという記事があります。他の人は、問題はcglibにあると言います。

java1.5_0_09、Spring 2.5とjavaassist3.4.GA、Tomcat 5.5をWebコンテナ、Oracle 10gをデータベースとして使用します。

誰でもこの問題の原因と解決方法を教えていただけますか?

+1

あなたはたくさんの文字列を使用していますか? PermGenにはinterned文字列があります – bajafresh4life

答えて

19

-XX:MaxPermSizeが機能する場合は、適切な値を取得する必要があります。デフォルトは、クライアント・モードのVMでは32MB、サーバー・モードのVMでは64MBと考えています。春とHibernateがランタイムで生成されたクラスを多用し、それらの時々多くを作ることができるので、

java -XX:MaxPermSize=256m 

問題が発生します。あなたはメモリを持っている場合、私は、256メガバイトに設定することをお勧めします。これらの生成されたクラスはすべてPermGenメモリプールに格納されるため、これらのフレームワークを使用する場合、PermGenを大量に増やす必要があります。

+11

これは問題の発生を遅らせるだけです。アプリケーションが定期的にクラスを生成する場合は、毎回サーバーを再起動する必要があります。 – Stroboskop

+0

悲しいことに、はい。私たちはかなりそれに固執しているようです。 – skaffman

+0

@skaffman、これは、SpringとHibernateの上に構築されたアプリケーションがPermGenのOOMを防ぐために再起動する必要があることを意味しますか?私は、新しいコードをプッシュしない限り、私のサーバーを永久に望みます。 –

3

skaffmanによれば、-XX:MaxPermSizeプロパティは機能しますが、時には上限を上げることが遅れるという根本的な問題が生じることがあります。

this noteを見ましたか?それは私にも同様の問題を一度解決する助けとなりました。 Tomcatのため、WEB-INF/libのにコモンズ・ログインを入れないでください

  • 入れJDBCの共通/ libにドライバ(tomcat documentationが言うように)とないlibのWEB-INF /中
  • :リンクを要約する 既にブートストラップしています
4

私はこの問題をHibernate(Springなしで使用)で見ました。問題は、アプリケーションの存続期間中に単一のインスタンスを作成するのではなく、各ユーザーの要求に対してSessionFactoryのインスタンスを作成していたことです。

私はこれを調べて問題を発見するためにYourKit profilerを使用しました。

8

Tomcatの一部のバージョンでは、戦争の再展開時にメモリリークが発生することに注意する必要があります。それはtomcat 6.0.xで私に起こった。

MaxPermSizeを増やすことをお勧めしますが、これは開発マシンの一時的な解決策です。エラーが発生した場合、2-3日後にサーバーを再起動してください。プロダクションではそれほど簡単ではありません。したがって、このは開発用にが動作しますが、このアプローチはでは動作しません。、メモリリークの問題を修正する必要があります。

リークを発見するには、jdk 1.6と1.5に付属のjconsoleアプリケーションを使用してください。プロセスにバインドして、時間の経過とともに使用されるメモリを監視することができます。

またこれらを読むことができます:

2

ビジュアルGCを、今JDK 6の一部であり、リアルタイムで非常に素晴らしいグラフィック表現を提供します。 eden、generational、およびperm空間に何が起こっているかを見ることができます。理由は分かりません。

UPDATE:JDK 1.6.0_13ディストリビューションのbin/jvisualvm.exeです。監視するプロセスのPIDを指定します。

+1

それは面白いです。 PermGenプールは不透明であり、JVMTIデバッグインタフェースでは見えません。私はVidual GCがどのように見えるのだろうか? – skaffman

0

ここでのすべての応答は、web-appのいくつかの再起動のために起こるPermGenの問題ですが、この場合、Tomcatを再起動した後の最初の展開で問題が発生しているため、ClassLoaderの参照やコモンロギング。

+0

これは答えではありません。元の質問を編集し、この情報を追加する必要があります。 –

0

jdk6を実行している場合は、jconsoleアプリケーションを使用してアプリケーションのメモリ使用量を監視し、さらに調査することができます。

もう1つの方法として、プロファイラを使用して、私はJProfilerを使用してアプリケーションを見ていきます。問題がどこから来ているかを正確に伝えます。

0

同じ問題が発生しましたが、私はread thatです。この状況では、Tomcatが原因です。

その後、私は代わりに桟橋に切り替わり、すべてが素晴らしいと判明し、アプリケーションは期待通りに展開/実行されます。 もしtomcatが必須でないなら、私はJettyを提案したいと思います。

関連する問題