3

root 権限で Tomcat を実行していますが、アクセスするたびに catalina.log にログが記録されずに Tomcat プロセスが終了する URL があります。アプリケーションにデッド ループがあることがわかりました。しかし、私の仮定では、リクエストを処理する際のデッド ループ (実際には無限の再帰) は、Tomcat によって作成されている現在のスレッドを終了させる可能性のあるスタック オーバーフロー例外につながる可能性があるだけです。

私の質問は、アプリケーションのデッド ループが原因で Tomcat 全体がクラッシュした可能性はありますか? もしそうなら、どうすればエラーログを観察できますか?

申し訳ありませんが、実際にはコード内の無限再帰であると指摘しませんでした。Eclipse で何度もデバッグしました。これは再帰であり、リクエストを停止することはありませんが、長時間待った後に StackOverflowError が返されるだけです。 、しかし、なぜTomcatがクラッシュしたのか疑問に思っていましたか?

4

1 に答える 1

2

もっと具体的にして、関連するコードを表示する必要があります。ただし、いくつかの考えがあります。

  • 無限ループだけでは、StackOverflowError. 無期限に停止するだけです。この例外は通常、深い再帰が原因でスタック領域が不足したために発生しますが、これはコードの記述方法ではありません。

  • 問題のあるコードがどこにあるかについての予感があるようです。その場合、より多くの情報を得るために、ログ メッセージを自分で追加する必要があります。Tomcat でのログインについては、次のリソースを参照してください。

  • また、デバッガーでサービスを実行したり (多くの IDE と同様に、Eclipse には Web アプリケーション デバッガーがあります)、Tomcat の外部でコードをテストしたりすることを検討することもできます。

より具体的な回答が必要な場合は、より詳細な情報を投稿する必要があります。


編集に関する更新:

Tomcat は、すべての Web アプリケーションを単一の JVM で実行します (また、その JVM でも実行されます)。異なるクラス ローダーを使用するだけです。これは、すべてのアプリケーションが同じスタック スペースを共有することを意味するため、1 つのアプリがスタック スペースを使いすぎると、他のアプリや Tomcat 自体にも問題が発生する可能性があり、独自のスタック オーバーフロー エラーが発生する可能性があります。これは、コードを見なくてもできる限り具体的です。

誤動作のリスクがあるアプリケーションが 1 つある場合、複数の Tomcat インスタンス (つまり、個別の JVM) を実行して、そのアプリケーションの問題が他のアプリケーションに影響を与えないようにすることができます。複数のインスタンスを実行してそれらを統合する方法については、Tomcat ディストリビューションに含まれているファイルRUNNING.TXTを参照してください。

ただし、明らかに最善の方法は、コード内の問題を修正することです。:)

于 2013-11-08T06:36:39.887 に答える