注:這是一段測試用的java程序,將其運行起來。
在命令行輸入:
pidstat -p 843 1 3 -u -t
/*
-u:代表對cpu使用率的監控
參數1 3:表示每秒采樣一次,一共三次
-t:將監控級別細化到線程
*/
運行命令顯示如下圖所示:
注:其實中TID就是線程ID,%usr表示用戶線程使用率,從圖中可以看到855這個線程占用cpu非常的高。
再輸入如下命令:
jstack -l 843 > /tmp/testlog.txt
查看testlog.txt顯示如下部分內容:
注:我們關注的是日志文件的NID這個字段,它對應的就是我們上面說的TID,NID是TID的16進制表示,將上面的十進制855轉換成十六進制為357,在日志中進行搜索看到如下內容:
"Thread-0" prio=10 tid=0x00007f7d90103800 nid=0x357 runnable [0x00007f7d943d5000]
java.lang.Thread.State: RUNNABLE
at PidstatTest$PidstatTask.run(PidstatTest.java:13)
at java.lang.Thread.run(Thread.java:722)
Locked ownable synchronizers:
- None
以此可以推斷出有性能瓶頸的程序點。
2、pidstat具體命令詳解
pidstat是一個功能非常強大的性能監測工具,他是Sysstat的組件之一,可以從http://sebastien.godard.pagesperso-orange.fr/download.html 進行下載,下載后可以通過./configure
等命令進行安裝,這個命令的強大之處在于不僅可以監控進程的性能情況,也可以監控線程的性能情況。
pidstat監控cpu常用顯示字段內容如下:
1、PID - 被監控的任務的進程號
2、%usr - 當在用戶層執行(應用程序)時這個任務的cpu使用率,和 nice 優先級無關。注意這個字段計算的cpu時間不包括在虛擬處理器中花去的時間。
3、%system - 這個任務在系統層使用時的cpu使用率。
4、%guest - 任務花費在虛擬機上的cpu使用率(運行在虛擬處理器)。
5、%CPU - 任務總的cpu使用率。在SMP環境(多處理器)中,如果在命令行中輸入-I參數的話,cpu使用率會除以你的cpu數量。
6、CPU - 正在運行這個任務的處理器編號。
7、Command - 這個任務的命令名稱。
pidstat監控io常用的字段顯示內容如下:
1、kB_rd/s - 任務從硬盤上的讀取速度(kb)
2、kB_wr/s - 任務向硬盤中的寫入速度(kb)
3、kB_ccwr/s - 任務寫入磁盤被取消的速率(kb)
三、一個內存溢出案例分析
1、內存溢出現象
系統共有8臺服務器,每次隨機只有一臺服務器報java.lang.OutOfMemoryError: GC overhead limit exceeded
錯誤,然后接著就報內存溢出錯誤java.lang.OutOfMemoryError: Java heap space
。
2、理論支撐
原文轉自:http://www.jianshu.com/p/6df2963fe94e