5


5

Apache Tomcatリクエストスレッド

控えめに言っても、少しメモリをリークするアプリケーションがあります。

私は `jvisualvm`を使用して、問題の原因を探しています。

次の名前で始まるスレッドでスレッド数がかなり増加するのがわかります:* http-8080-例:http:8080-42 *

私の最初の推測は、各クライアントリクエストが独自のスレッドで処理されるため、これらのスレッドはそれぞれクライアントからのリクエストヒットであるということです。

私の問題は、これらのスレッドが長時間実行されていることです(これまで10分)。

私の質問はこれです:

私の仮定は正しいですか? もしそうなら、なぜスレッドがそんなに長い間実行されるのですか? クライアントのリクエストを処理するのに忙しいことはありませんか?

3 Answer


6


Tomcatには常に多くの待機HTTPスレッドがあります。たとえば、デフォルトのコネクタ設定を見ると:


常に少なくとも25のスレッドがライブであるはずですが、接続を待機していることがわかります(maxThreadsの制限まで)。 これは、minおよびmaxSpareThreads属性によって制御されます。

JVisual VMは、スレッドがリソースなどで待機またはロックしていることをどのように示していますか?


2


Tomcatコネクタの構成を確認してください。 「maxThreads」と他のスレッドプール設定に注意してください。 よくある間違いは、実際に「調整」せずに「maxThreads」を増やすだけです。 不必要に大きなプールを構成すると、多くのアイドルスレッドが発生します。 これは役に立ちません。

明らかですが、レコードについてのみ、TIMED_WAITINGスレッドはタイムアウトし、WAITINGスレッドは単に `notify()`または `notifyAll()`を待機します。


1


一般的に、アプリケーションサーバーは多数のスレッドを事前に作成します。 アプリサーバーはそれらを作成するだけでなく、スレッドを保持します。 これはスレッドプールと呼ばれます。 サーバーはリクエストを受け取ってスレッドにディスパッチし、そのリクエストが完了すると、サーバーはそのスレッドに新しいリクエストをディスパッチします。

スレッド作成のオーバーヘッドはかなり高いため、多くの要求を処理することは、スレッドを共有することから大きなメリットを得ます。 質問に答えるために、サーバーによって作成されたスレッドのディスパッチ(重大なランタイムエラーが発生しないと仮定)は、サーバーの存続期間中有効です。

あなたが見ているものに関しては、多くのスレッドが開始されているのを見ると、アプリケーションの他の部分がスレッドをフォークしている可能性がありますが、これは完全に別の問題です。

Tomcatサーバーは、リクエストごとに新しいスレッドを作成してはならないことを知っておくことが重要です(これも一般的に言えば)スレッドを再利用する必要があります。