簡體   English   中英

JAVA 線程轉儲:等待線程太多

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM