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 必须在它们之间切换。