亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ThreadDump:如何查看等待條件/或任何其他條件?

ThreadDump:如何查看等待條件/或任何其他條件?

梵蒂岡之花 2023-07-19 17:08:12
我已經對生產中部署的應用程序進行了線程轉儲,該應用程序使用 logback。我不是分析線程轉儲的專家,但是,我需要這樣做。我正在學習,也看了一些網上的文章。下面是真實的線程轉儲:"logback-8" #136 daemon prio=5 os_prio=0 tid=0x00007f3588001000 nid=0x13a waiting on condition [0x00007f35f8e7b000]   java.lang.Thread.State: WAITING (parking)        at sun.misc.Unsafe.park(Native Method)        - parking to wait for  <0x000000068d740338> (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.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)        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)正如我所看到的,大多數線程都處于 WAITING 狀態。但我怎么知道他們到底在等什么?這些所有線程是否都試圖“等待”“某事”?我確實閱讀了一些在線材料,但是當看到真正的線程轉儲時,對于如何采取步驟來理解這些線程到底試圖做什么以及它們在等待什么,這對我來說沒有任何意義,被封鎖等誰能幫我理解這一點嗎?
查看完整描述

3 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

據我分析線程轉儲,當您使用 Spring 等框架或其他庫(如您在此處使用的 Logback)時。他們根據您的配置創建線程池。例如,您可以在 applicationcontext.xml 或任何基于 java 的配置類中找到此類配置。因此,它的作用是,它將在應用程序啟動或第一次初始化調用時創建那么多線程。如果有任何任務到來,那么框架將從池中選擇一個線程并分配給它。任務完成后,線程將回到池中,此時線程狀態將是WAITING(正在停車)。這并不意味著它被任何線程阻塞。如果您的服務器有足夠的能力處理此類池,則不會導致任何性能問題。他們只是坐在理想的位置,因為他們沒有任何任務要做。

查看完整回答
反對 回復 2023-07-19
?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

根據上面的堆棧跟蹤,有以下推論

  • 有一個隊列Q。

  • N 個作業(可運行)被添加到隊列中。

  • 這些作業將從隊列中取出并由 ThreadPoolExecutors 中的線程執行(可以緩存/動態)。

假設,我們有一個只有兩個線程(固定大?。┑木€程池執行器,并且您只向隊列提交了一個作業。(作業1)

Thread1從隊列中取出job1并執行。一旦執行結束,就會進入WAITING狀態,因為隊列中沒有元素。它沒有工作要做。堆棧跟蹤上存在等待線程并不意味著它們是有害的。


查看完整回答
反對 回復 2023-07-19
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

您可能要做的第一件事是搜索 Runnable 線程及其已鎖定的同步器。可運行線程如果長時間掛起,則很有可能正在執行 IO 或 DB 操作。以 30 秒左右的間隔進行后續線程轉儲并進行比較研究。



查看完整回答
反對 回復 2023-07-19
  • 3 回答
  • 0 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號