22

Spring-Hibernate を使用して登録ユーザー データを Oracle データベースに保持する Web アプリケーションがあります。アプリケーションは開発環境では正常に動作しますが、より多くのデータを含むライブ環境にコピーすると失敗しました。最初はアプリケーションは正常に起動しますが、いくつかのアクションの後、「PermGen out of space」という例外が発生しました。

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

たとえば、多くの人が-XX:MaxPermSizeJVM パラメータを増やすことを申し出ますが、他の人はそれがうまくいかないと言います。javassist ライブラリなどの使用上の問題や、cglib ライブラリを使用する必要があるという投稿があります。他の人は、問題は cglib にあると言っています。

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

この問題の原因と解決方法を誰かに説明してもらえますか?

4

8 に答える 8

19

これ-XX:MaxPermSizeは機能します。適切な値を取得する必要があります。デフォルトは、クライアント モードの VM では 32 MB、サーバー モードの VM では 64 MB だと思います。メモリがある場合は、256mb に設定することをお勧めします。

java -XX:MaxPermSize=256m

この問題が発生するのは、Spring と Hibernate が実行時に生成されたクラスを大量に (場合によっては大量に) 使用する可能性があるためです。これらの生成されたクラスはすべて PermGen メモリ プールに入れられるため、これらのフレームワークを使用する場合、多くの場合、PermGen を大量にブーストする必要があります。

于 2009-07-14T08:30:24.303 に答える
8

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

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

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

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

于 2009-07-14T09:09:57.423 に答える
4

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

YourKit プロファイラーを使用してこれを調査し、問題を発見しました。

于 2009-07-14T08:39:57.390 に答える
3

skaffman が言うように、 -XX:MaxPermSize プロパティは機能しますが、制限の引き上げが遅延するだけであるという根本的な問題が発生する場合があります。

このメモを見たことがありますか?かつて同様の問題を解決するのに役立ちました。リンクを要約するには:

  • JDBC ドライバーを ( Tomcat のドキュメントにあるように) common/lib に配置し、WEB-INF/lib には配置しません。
  • tomcat がすでにブートストラップしているため、commons-logging を WEB-INF/lib に配置しないでください。
于 2009-07-14T08:35:55.027 に答える
2

Visual GC は現在 JDK 6 の一部であり、メモリの非常に優れたグラフィカル表現をリアルタイムで提供します。エデン空間、世代空間、パーマ空間に何が起きているかがわかります。理由がわからないだけです。

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

于 2009-07-14T09:46:54.277 に答える
0

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

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

于 2009-07-14T14:31:53.643 に答える
0

私は同じ問題に遭遇しました.Tomcatがこの状況の犯人であることを読みました.

次に、代わりに jetty に切り替えたところ、すべてがうまくいき、アプリは期待どおりにデプロイ/実行されました。したがって、Tomcat が必須でない場合は、Jetty をお勧めします。

于 2011-10-04T11:49:38.013 に答える
0

ここでのすべての応答は、Web アプリの再起動が原因で発生する PermGen の問題に関連していますが、この場合、Tomcat の再起動後の最初の展開で問題がすでに発生しているため、ClassLoader の参照や commons-logging の問題ではありません。

于 2009-07-14T11:01:20.117 に答える