2012-03-18 6 views
-1

友人、多くのスレッドの接続作成システム不安定

私はそれが一度に6000の着信要求を処理することができますJAVA TCPリスナーを、構築しています。私はソケット接続を作成し、データを受け入れると、私はスレッドを作成して、いくつかの操作をしていますが、私はこのスレッドを殺していない、デバイスは2分ごとにデータを送信するので、 30秒間スリープモードにします。

しかし、システムを5分間実行した後、tomcat6.0で実行されているアプリケーションでエラーが発生しました - 「Webアプリケーションは[Thread-214]という名前のスレッドを開始したようですが、これを停止できませんでした。メモリリークを引き起こす可能性があります。

私はどこが間違っているのか理解してもらえますか?

ありがとうございます。

+0

[Tomcat 6.0アプリケーションでのメモリリーク]の可能な複製(http://stackoverflow.com/questions/9753120/memory-leak-in-tomcat-6-0-application) – duffymo

+1

Tomcatはサーブレットコンテナであり、それ自体で要求とスレッドを処理します。あなたは間違った方法でそれを使用しています。あなたが達成しようとしていることは、スタンドアロンのアプリケーションで行う必要があります。もう1つの質問でコメントされているように、あなたはスレッドを生かしておき、ユーザーが戻って同じスレッドを使うことができます。この代わりに、メモリ内のキャッシュまたは永続性を使用してください。あなたの全体的なデザインに欠陥があります。 – Sean

+0

スレッドを作成して開始するために使用しているコードを投稿してください。 – Java42

答えて

2

を使うべきかもしれません。 すべてのソケットを経由する1つのスレッドを使用してみてください。 Javaセレクタを参照してください http://www.exampledepot.com/egs/java.nio/NbClient.html

+0

このリンクがどのように役立つのか教えてください。 – geekIndiana

+0

あなたのケースでは、ほとんどの時間アイドル状態にある多くのソケットを処理する必要があります。あなたが各ソケットを与えるなら、非常に速くメモリが足りなくなります。セレクタは無限ループで、アクションを実行したいソケット上でイベントを受け取る(2分ごとにデータを送信する)イテレータを提供します。それに応じてデータを読んで行動することができます。 – Horonchik

-2

あなたは、多くのソケットを持っている場合は、代わりに、チャネルごとにスレッドを使用するのでは、スレッドプール

http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

+0

あなたの答えを拡大したいかもしれません。それがそのままでは、それはあまり有用ではありません。 – Jeffrey

1

オペレーティングシステムでは、あまり多くのスレッドを処理できないことに注意してください。さらに、スレッドごとにメモリが割り当てられるため、ヒープを非常に速く埋めることができます。

私はあなたの達成しようとしているものがわからないため、アプリケーションに設計上の欠陥があると推測しています。通常、スレッドは要求を処理するために再利用されます。

+0

+1 - "あなたのアプリケーションに設計上の欠陥があると推測しています。通常、スレッドは要求を処理するために再利用されます。"これは絶対に正しいです。 – duffymo

+0

@レミ、私は基本的なルールを知っていると私はスレッドの再利用性の利点を知っているが、私は私のシナリオで私は車に搭載されているGPSデバイスとの接続を失うしたくないと議論したように、接続を失って接続を再度作成することは困難です。したがって、私は、接続を作成し、常に同じスレッドを使用してデータを読み続けるために別のスレッドを作成しています。私が間違っている場所を教えてください。ありがとう – geekIndiana

+0

なぜ私は接続ごとにスレッドを作成する必要が表示されません、接続のリストを処理する1つのハートビートスレッドを持つことはできません?ショーンが言ったように、あなたはTomcatが必要ですか? –

0

セレクタが役立つと思います。このリンクのSelectorについての短い紹介をお読みください。http://tutorials.jenkov.com/java-nio/selectors.html "Selectorは、1つ以上のNIO Channelを調べ、読み込みや書き込みなどの準備ができているチャンネルを判断できるJava NIOコンポーネントです。複数のチャネルを管理し、複数のネットワーク接続を管理できます。

0

Javaで多くのTCP接続を処理する必要がある場合は、NIOを使用する必要があります。しかし、裸のNIO(セレクタ)をプログラミングするのは難しいです - だから、Nettyを使用してください。それはそのようなタスクのために特別に設計されています。またNettyはTomcat内部でうまく動作します。

関連する問題