我在java服务器应用程序中使用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)
(上面的输出是从线程转储中检索的)
有人遇到过这个问题吗?有什么解决办法吗?
谢谢!
编辑。
最大的问题是线程永远不会终止,并且在应用程序终止之前一直保持活动状态。
这是正常情况,您的线程池由于高负载而显著增长,然后负载下降。在这种情况下,池中的大多数线程都在等待新任务的到来。
你可以通过改变核心池大小和最大池大小来杀死空闲的工人:
executor.setCorePoolSize(x);
executor.setMaximumPoolSize(y);