線程異常關注兩個東西,一個是線程狀態,一個是線程的連接數
應用設計的時候需要考慮資源的限制,才能避免應用在某些時候因爲資源過度而崩潰,線程數的控制非常重要。程序無限制的創建最終導致不可控,特別是隱藏在代碼中的創建線程的方法
當系統的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的問題以及查看線程狀態的問題