2011-11-10 17 views
24

私のJavaアプリケーション(tomcat6で実行される)が終了しないスレッドを多数生成することに気付きました。待機/スリープスレッドの原因の特定

だから私は、スレッドダンプを作成し、このように、待機中のスレッドのトンがあることに気づいた:

"pool-1-thread-22" prio=5 tid=101b4b000 nid=0x127122000 waiting on condition [127121000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <6c340cee0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:680) 
    Locked ownable synchronizers: 
    - None 

今の質問は次のとおりです。待っているこれらのスレッドは何ですか? 私はこれらのスレッドを生成すると思われる疑わしいクラスを持っていますが、正確にこれらのスレッドがスタックしているのはわかりません。

クラスごとにラインを分割し、スレッドの動作を監視し続けることを除いて、これの原因を見つけるためにできることはありますか?

+1

um彼らはキューでブロックしています。特に、キューが空のときに無期限にブロックする 'LinkedBlockingQueue.take()'。 –

+1

それはどういう意味ですか?どのようなキューとそのメソッド 'take()'は何をしますか? – Timo

+1

ええと、あなたのコードです...私たちは霊的ではありません。スレッドダンプが何を伝えているかを正確に伝えるだけです。 –

答えて

19

tomcatでは、通常、誰かが接続するのを待っているワーカースレッドを要求します。 何も心配する必要はありません。彼らはあなたのサーバーに同時に接続する100人のユーザーを処理する準備が整いました。

+0

それはできません。これらのスレッドを生成するアプリケーション内のボタンを明示的にクリックできます。クリックすると、これらのスレッドが表示されます。しばらくすると、これらのスレッドは非常に多くのメモリを消費し、サーバがクラッシュします。 – Timo

+0

スレッドがブロックされている(たとえば、キュ​​ーで待機している)場合、スレッドは実行されていないため、何も要求できません。もしあれば、それらのスタックはしばらく待ってからページアウトすることができ、実際には実際のRAMの使用を減らします。 –

+5

これについては@ emptyxに同意するつもりです。アプリケーションのボタンをクリックすると、Tomcatサーバーにリクエストが送信されると考えられます。私が推測するのは、エンタープライズになるためには、Tomcatには非常に多くのリクエストを処理できるようにするという悪い設定があるということです。 Tomcatは 'corePoolSize'に達していないので、' ThreadPoolExecutor'に新しい 'Thread'を作り続けます。大量のスレッドを構成していて、それらのスレッドに必要なすべてのスタック領域を割り当てるのに十分なメモリがないため、最終的にサーバーがクラッシュします。しかし、それは私の推測です。 –

6

これらのスレッドはThreadPoolの一部です。より具体的にはjava.util.concurrent.ThreadPoolExecutor。スレッドはRunnable/Callableがプールに送信されるのを待っています。例えば

ExecutorService e = Executors.newFixedThreadPool(10); 

e.submit(new Runnable(){ 
    public void run(){ ...} 
}); 

はその後1つのスレッドが通知され、それが実行可能に起動されるまで待機を座って10個のスレッドを作成します。彼らは何のために使われているのか分からない。スレッドプールが何を開始したのかを知る必要があります。アプリケーションサーバーへのクライアント要求を処理する可能性があります。

+0

そうは思わない。これらのスレッドは固定されていません。ユーザーがアプリケーションとやり取りするときに動的に作成されます。長い使用の後には、10だけでなく数百もあります。 – Timo

+0

私は、ユーザーがやりとりした後に何が起こるかを調べなければならないと思います。私の例のように誰でもこれらのスレッドを作成することができます。起こっていることのコードを私たちにもらったら、助けてくれるでしょう。 –

関連する問題