2016-11-18 9 views
0

JavaサーバーアプリケーションでjWebsocket libを使用してストレステスト(1分あたり数千件の接続)を実行していますが、しばらくしてプロセスは次のようなjWebsocketスレッドで完全に埋められます:jWebsocketたくさんの待機スレッド(待機中)

"jWebSocket TCP-Engine NIO writer" prio=10 tid=0x0000000000bf6000 nid=0x2eb9 waiting on condition [0x00007f1533bd9000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x000000062ab06e80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

(上記の出力は、スレッドダンプから取得された)

は、誰もがこの問題に直面していますか?ソリューションを見つけるためのヒント

ありがとうございます!

編集。

大きな問題は、スレッドが終了されず、アプリケーションが終了するまで有効であることです。

答えて

1

これは通常の状況です。負荷が大きいためスレッドプールが大きく増加し、負荷が低下します。この場合、プール内のスレッドのほとんどは、新しいタスクが効果的に何もしないのを待っています。

あなたはコアプールサイズと最大プールサイズを変更することで、アイドルの労働者を殺すことができます。

executor.setCorePoolSize(x); 
executor.setMaximumPoolSize(y); 
+0

を私は非常に重要な注意点を言及するのを忘れてしまった:)スレッドが破壊されていないと、アプリケーションがあるまで生き続けています再開されました。 –

+0

あなたを悩ませる場合に備えて、私はあなたに「殺す」ソリューションを提供しました。あなたが見ているものは完全に正常です。スレッドは新しいタスクを待っています。それを実行するためのフィードを送り、タスクの実行を開始します。 – hoaz

関連する問題