[英]JAVA Thread Dump: Too many waiting 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)
我在我的應用程序的許多地方使用 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);
}
}
這些應用程序在 JAVA 1.8.0_65 和 tomcat 8.0.5 上運行 誰能指導我如何解決這個等待線程過多的問題,或者我應該如何執行分析以解決問題。 對於阻塞的線程,我已經找出問題並修復了它。
使用 thread.sleep() 線程仍然存在,但處於掛起模式。 在重負載下,您必須達到最大線程限制,因為系統需要創建新線程,因為現有線程由於休眠而未完成當前工作。 這是高響應時間的原因。
增加線程數應該可以解決這個問題,但要注意您的系統硬件限制。 如果達到 CPU/內存限制,則必須添加更多服務器以提高吞吐量。 我很確定如果減少睡眠時間,您的應用程序的性能將會提高,但這可能首先是您的要求。
似乎更多等待線程是更多線程處於活動狀態的副作用,因為 CPU 必須在它們之間切換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.