java线程转储中的高线程数

时间:2017-09-25 06:35:00

标签: java wildfly cpu-usage

我在wildfly-9.0.1.Final上运行的java Web应用程序有时会消耗非常高的内存和CPU。 我得到了这次的线程转储,并发现了超过7K的线程与相同的线程,下面的堆栈跟踪。

pool-47940-thread-1 - priority:5 - threadId:0x000000029ad3f800 - nativeId:0xfad0 - state:WAITING
stackTrace:
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007a7d1fbe0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronize

我使用this

分析线程转储

这是相同的截图。 enter image description here

enter image description here

我多次在我的应用程序中使用以下代码

ExecutorService executor = Executors.newFixedThreadPool(3);
//business logic
// This will make the executor accept no new threads and finish all existing threads in the queue
executor.shutdown();
// Wait until all threads are finish
while (!executor.isTerminated()) {

}

深色代码会导致任何问题吗?

这个线程是高内存和CPU使用率的根本原因吗?

2 个答案:

答案 0 :(得分:1)

在上面的代码中,我使用while (!executor.isTerminated()){}等待所有任务完成了他们的工作。这个while循环使用CPU直到所有任务完成,这可能会导致高CPU问题。

我修改了我的代码如下。这解决了我的高CPU问题。

ExecutorService executor = Executors.newFixedThreadPool(3);
executor.shutdown();
executor.invokeAll(listOfTask);  // invokAll method will wait untill all task finished, No while loop here

了解更多信息read this

答案 1 :(得分:0)

大量的线程可能会导致内存问题,但如果所有线程都处于WAITING状态,那么它们就不会消耗处理器滴答。

我建议你逐一解决问题。

要找出所有内存卡住的位置,您需要获取内存转储,并使用MAT等工具进行分析。

可以使用SDK中的jconsolejvisualvm分析CPU消耗问题。他们俩都有分析工具。