【性能調優】線程異常問題分析

線程異常關注兩個東西,一個是線程狀態,一個是線程的連接數
應用設計的時候需要考慮資源的限制,才能避免應用在某些時候因爲資源過度而崩潰,線程數的控制非常重要。程序無限制的創建最終導致不可控,特別是隱藏在代碼中的創建線程的方法
當系統的SY值過高時,表示linux要花費更多的時間來進行線程的切換。java造成這樣現象的主要原因是創建的線程比較多,這些線程都處於不斷的阻塞、鎖等待、IO等待和執行狀態的變化過程中,這就產生了大量的上下文切換。java程序在創建線程時會操作JVM堆外的物理內存,太多的線程也會使用過多的物理內存,導致了系統報如下錯誤

Exception in thread "main" java.lang.OutOfMemoryError:
unable to creat new native thread

這個錯誤即系統創建了太多的線程導致

線程數
以下幾種命令都可以幫忙定位線程數的問題

  • cat /proc/pid/status
  • top -bH -d 3 -p pid
  • pstree -p pid | wc -l pstack
  • pid | head -1

cat /proc/pid/status
在這裏插入圖片描述

線程狀態
線程狀態有:

  • blocked(當一個線程試圖獲取一個對象鎖,而這對象鎖被其他線程持有)
  • Waiting(一個線程在等待另一個線程執行喚醒動作)
  • Time_Waiting(線程在遇到sleep方法和wait方法時就會進入Time Waiting狀態)
  • New Runnable(線程剛被創建,但未被啓動)
  • Terminated(因爲run方法正常的退出而死亡,或者因爲遇到異常而死亡)

其中最需要關注的是 blocked、Waiting和Time_Waiting的狀態。特別是block狀態,在獲取不到CPU執行時間的時候,這樣系統的性能就會下降
在這裏插入圖片描述
CPU飆升需要定位程序CPU的問題以及查看線程狀態的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章