6

Tomcat 6.0.20、4 月 1.2、jdk 1.6.0_15 と mysql 5.1.38 を 4 GB RAM の rhel ボックスで実行しています。5 人のユーザーを持つ 1 つの単純な jsp/サーブレット アプリケーション、64 人のユーザーを持つ 1 つの struts 1.2.0.9、35 人のユーザーを持つ 1 つの struts 2.0 アプリケーションがあります。Struts 2.0 のユーザーは毎秒、1 日に約 900 のエントリを作成します。最後の 2 つのアプリケーションでは、永続化のためにトップリンクも使用しています。コード内で、参照されていないすべてのオブジェクトを null に宣言し、struts 2 サイトと tomcat サイトからの構成ファイルに運用値を適用しました。mysql でスレッド キャッシングを適用し、wait_timeout と interactive_timeout を tomcat のセッション タイムアウトと同等になるように減らしました。Linux でファイル記述子を増やしました。作り直されたクエリ。スレッド ダンプを調べ、gc 統計を監視し、これに基づいて上記の変更を適用し、

まだ「java.lang.OutOfMemoryError」エラーに直面しています。

時々、それはさまざまなもののためであり、時にはその Servlet.service() 、時にはその image.servlet 、時にはそれを引き起こすジャスパーです。

エラーは一定ではなく、時間の経過とともに変化し続けるため、非常にイライラします

どんな助けでも大歓迎です!!!

JAVA_OPTS=-server -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSParallelRemarkEnabled (Tomcat マネージャーは 34 MB が空であると報告するため、permsize、mx、mn などは使用していません)

persistence.xml

 <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/dbname?autoReconnect=false"/>

サーバー.xml

<Connector port="80" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443" compression="on" compressableMimeType="application/octet-stream,text/html,text/xml,text/plain,application/x-javascript,image/gif,text/css,image/gif,application/vnd.ms-excel,application/pdf" enableLookups="false"/>

context.xml

<Context reloadable="false" delegate="false" privileged="false">
4

4 に答える 4

5

まず、どのプロセスがすべての CPU を消費しているかを確認する必要があります。それは本当にJavaプログラムですか?top(1)まだ理解していない場合は、これを理解してみてください。

持っていて、それが Java プログラムであることが確実な場合は、リモート デバッグを有効にします。次回 CPU が沸騰するときは、接続してスレッドが無限ループに陥っていないことを確認してください。

そうでない場合は、メモリ不足です (Tomcat マネージャーが何と言おうと)。JMX コンソールを起動し、さまざまなメモリ空間を確認します。私の推測では、permgen はかなりいっぱいです (クラスパスに大きな JAR がたくさんありますか? それともどこかで cglib を使用していますか?) その場合 (そして perm gen GC が有効になっているため)、Java VM はメモリを解放しようとします。ずっとパーマジェネスペース。

実行時にクラス ファイルを作成するもの (たとえば、Groovy などのスクリプト言語) を使用していない限り、それは機能しません。通常の Java プログラムでは、クラスを GC することはできません。それでも実行すると、GC は実行され、実行され、すべての CPU パワーを消費するだけになります。

于 2009-10-09T08:21:23.940 に答える
1

おそらく、それは12で対処された同じ問題です。小さなトランザクションのみを作成するようにしてください。

于 2010-04-22T07:33:58.310 に答える
0

jstat を使用して tomcat のメモリとガベージ コレクションのパターンを監視することをお勧めします。

パーマ ジェネのエラーに直面しているとのことですが、パーマ ジェネの量を増やしていません。tomcat アプリをリロードすると perm gen リークが発生する可能性がありますが、おそらくすべてのページを開く前に使用状況を観察しているため、より多くのクラスが perm gen に読み込まれることになります。

于 2009-10-09T08:25:09.387 に答える
0

あなたの問題は、次のようなコードを持っていることです:

       new Thread(){
          public void run(){
             //something
          }
       }.start();

これにより、Tomcat のキャッシュに新しいクラス定義ファイルが作成されるたびに、スペースが消費されるため、PermGenSpace 例外が発生します...

カスタムクラスを「その場で」作成しないように重要なクラスの一部を書き直し、個別の内部クラスを作成すると、状況が変わります...

      class MyJobDoer extends Thread{
          public void run(){
             //something
          }
       }

      MyJobDoer mjd=new MyJobDoer();
      mjd.start();
于 2009-10-09T10:53:51.450 に答える