私は、Tomcat で実行される実稼働 Web アプリケーション (Struts、iBatis、Hibernate) を使用しています。このアプリケーションは、6 ~ 7 日間の実行後に要求を処理している間にハングしますが、スレッド ダンプを実行すると再び正常に実行されます。
どうしてそうなったのか理解に苦しむ。
他の誰かが似たようなことに遭遇したことがあるかどうか疑問に思っていました。
私は、Tomcat で実行される実稼働 Web アプリケーション (Struts、iBatis、Hibernate) を使用しています。このアプリケーションは、6 ~ 7 日間の実行後に要求を処理している間にハングしますが、スレッド ダンプを実行すると再び正常に実行されます。
どうしてそうなったのか理解に苦しむ。
他の誰かが似たようなことに遭遇したことがあるかどうか疑問に思っていました。
おそらく、これは問題の原因を見つけるのに役立ちます。
Tomcat で JMX を有効にしました (Tomcat の起動時にこれらのオプションの vm 引数を設定します) -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=30188 (tc で jmx を実行するポートは何でも) -Dcom .sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
次に、(jmx を介して) メモリ使用量を監視し、メモリ使用量が 80% を超えた場合に通知する小さなアプリを作成しました。
そうすれば、何かがうまくいかなくなるとすぐにわかります。次に、メモリ内オブジェクトのヒストグラムを取得します (取得方法については、 http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.htmlを参照してください)。
最後に、私の ejbQL クエリの 1 つが大量のメモリを使用していることが判明しました。
それが何らかの形で役立つことを願って......
まず、これをテスト環境で再現してみてください。JMeterを使用してアプリにストレスをかけることができます。-verbose:gcおよび-XX:+ PrintGCDetailsを使用してTomcatを開始できます。これにより、GCの実行中に何が起こっているかについてより多くの洞察が得られます。次に、サイトが応答していないときにスレッドダンプを取得できます。これによりブロックが解除された場合は、GCの詳細で詳細を確認してください。