1. 使用top命令查看cpu占用高的進程
cpu使用率參數含義:
%us:us:用戶空間占用CPU的百分比。簡單來說,高我們是由程序引起的。通過分析線程堆棧很容易找到有問題的線程。
%sy:內核空間占用CPU的百分比。當sy為高時,如果它是由程序引起的,那么它基本上是由於線程上下文切換。
%ni:表示用戶空間且通過nice調度過的程序的cpu使用率。
%id:空閑cpu
%wa:cpu運行時在等待io的時間
%hi:cpu處理硬中斷的數量
%si:cpu處理軟中斷的數量
%st:被虛擬機偷走的cpu
%CPU為什么會超過100%?
%CPU是指進程占每個核的百分比之和,假設你的機器是2個cpu,每個cpu 4核,那么%CPU的最大值可以達到800%
2. 查看某個進程中所有線程的資源占用 top -Hp pid
3. 查看java線程信息
printf "%x\n" tid 可以獲取tid的16進制
jstack pid |grep -A 10 tid的16進制
java進程狀態
NEW // 沒有啟動過的線程狀態,當程序使用 new 關鍵字創建了一個線程之后,該線程就處於新建狀態,此時僅由 JVM 為其分配 內存,並初始化其成員變量的值
RUNNABLE // 當線程對象調用了 start()方法之后,該線程處於就緒狀態。Java 虛擬機會為其創建方法調用棧和 程序計數器,等待調度運行。
BLOCKED // 阻塞狀態,等待鎖(monitor lock)
WAITING //等待狀態,等待其他線程的某個操作,例如Object.wait Thread.join
TIMED_WAITING //帶有超時時間的等待狀態
TERMINATED //已終止線程狀態
備注:
如果大量的線程處於BLOCKED(on object monitor) 狀態,可能是一個全局鎖阻塞了大量線程。
- java.lang.Thread.State: WAITING (parking):一直等那個條件發生;
- java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定時的,那個條件不到來,也將定時喚醒自己。
線程狀態為”Object.wait()“:
說明這個線程之前獲得了某個monitor,進入臨界區,但是發現執行條件不滿足,調用object.wait進入Wait Set
此時線程狀態大致分為:
- java.lang.Thread.State:WAITING (on object monitor)
- java.lang.Thread.State: TIMED_WAITING (on object monitor)
如果大量的線程在waiting on condition狀態,可能是第三方資源遲遲獲取不到導致大量線程進入等待狀態,比如網絡資源等。所以如果你發現有大量的線程都處在 Wait on condition,從線程堆棧看,正等待網絡讀寫,這可能是一個網絡瓶頸的征兆,因為網絡阻塞導致線程無法執行。
獲取monitor過程
每個 Monitor在某個時刻,只能被一個線程擁有,該線程就是 “Active Thread”,而其它線程都是 “Waiting Thread”,分別在兩個隊列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的線程狀態是 “Waiting for monitor entry”,而在 “Wait Set”中等待的線程狀態是 “in Object.wait()”。
參考博客:https://www.cnblogs.com/noteless/p/10372674.html
https://www.cnblogs.com/zhengyun_ustc/archive/2013/03/18/tda.html