---------------------------------------linux下如何定位代碼問題-------------------------------java
一、先經過top命令找到消耗cpu很高的進程id假設是123linux
二、執行top -p 123單獨監控該進程shell
三、在第2步的監控界面輸入H,獲取當前進程下的全部線程信息數據庫
四、找到消耗cpu特別高的線程編號,假設是123bash
五、執行jstack 123456對當前的進程作dump,輸出全部的線程信息服務器
6 將第4步獲得的線程編號11354轉成16進制是0x7bapp
7 根據第6步獲得的0x7b在第5步的線程信息裏面去找對應線程內容jvm
8 解讀線程信息,定位具體代碼位置工具
-----------------------------分割線----------------------------------------------性能
最近在壓力測試工做中碰到java應用某臺機器cpu比較高的狀況,特意下筆記之後總結:
一個簡單的淘寶認證接口 須要插入讀寫數據庫2次。每次爬取數據,入庫。完成。
正常狀況下:
應用使用cpu在 :50%--80%
壓力高--異常狀況下:
cpu利用率在:90%---90%
在網上查了下,通常java應用cpu太高基本上是由於
1.程序計算比較密集
2.程序死循環
3.程序邏請求堵塞
4.IO讀寫過高
方法一:
分析步驟:
1.登錄應用機器,top -d 1命令查看 當前佔用cpu資源最多的,通常排名第一位確定是java進程
通常也可能存在多個java進程
觀察 top 消耗第一的資源是PID=1679的線程
2.查看進程的哪一個線程佔用cpu比較高,取線上另一臺正常狀況下利用cpu比較高的應用:經過
ps -mp pid -o THREAD,tid,time命令查看該進程的線程狀況
經過以上線程CPU切片 耗時在pid=1679 Tid =1896 耗時 1分59秒,4%CPU佔用最大。時間最長。
TID爲1679的線程利用cpu資源比較多,怎麼能看到這個線程在幹什麼呢?
須要將1896 轉換爲16進制,便於在jvm堆棧中查找。
printf "%x\n" 1896 ----768
經過jstack命令來查看下當前內存狀態:
定位到cpu太高是IO讀寫過高 ,接下來就是找開發人員確認這段代碼是否能夠優化。
方法二:
在作壓測的時候,開發給了一個工具 show-busy-java-threads.sh
在排查Java
的CPU
性能問題時,找出Java進程中消耗cpu多(top us值太高)的線程,查看它的線程棧,從而找出有性能問題的方法調用。
####截取一段
其實就是個shell文件,把這個文件上傳到目標服務器(linux),記得更改文件的讀寫權限: chmod -R 777 show-busy-java-threads.sh
接方法一 top以後,只須要下命令 :./show-busy-java-threads.sh -p pid 後面CPU佔用高的定位就分析出來了,具體如圖