JAVA 线程转储:等待线程太多

Bil*_*ikh 5 java out-of-memory jstack vaadin7 java-threads

我在分析 vaadin 7.0 JAVA 应用程序的线程转储和用 Spring MVC 编写的集成层时遇到困难。处于等待状态的线程过多,导致应用程序在高峰时段变慢,并导致简单代码的执行延迟长达 10 秒。以下是等待线程中出现的跟踪:-

priority:5 - threadId:0x00007f98b48de800 - nativeId:0x6511 - nativeId (decimal):25873 - state:WAITING
stackTrace:
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006d5444af0> (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)
Run Code Online (Sandbox Code Playgroud)

我在应用程序的许多地方使用 API 轮询,以下是我如何进行 API 轮询的代码:-

@Override
        public void run()
        {
            int counter = 1;

            while (true)
            {
                try
                {
                    if (counter == 1)
                        Thread.sleep(5000);
                    else
                        Thread.sleep(10000);

                    System.out.println("Call Some API");
                    if (counter == 3)
                        break;

                    counter++;
                }
                catch (Throwable e)
                {
                    new CustomException(e);
                }
            }
Run Code Online (Sandbox Code Playgroud)

这些应用程序在 JAVA 1.8.0_65 和 tomcat 8.0.5 上运行,任何人都可以指导我如何解决等待线程过多的问题,或者我应该如何执行解析分析。对于阻塞的线程我已经找出了问题并修复了它。

线程转储结果

小智 0

使用 thread.sleep() 线程仍然处于活动状态,但处于挂起模式。在重负载下,您必须达到最大线程限制,因为系统需要创建新线程,因为现有线程由于休眠而尚未完成当前工作。这是响应时间长的原因。

增加线程数量应该可以解决此问题,但请注意系统硬件限制。如果达到 CPU/内存限制,则必须添加更多服务器来提高吞吐量。我非常确定,如果减少睡眠时间,您的应用程序的性能将会提高,但这可能是您首先的要求。

似乎更多的等待线程是更多线程处于活动状态的副作用,因为 CPU 必须在它们之间切换。