linuxjstack
『壹』 linux鐨刢pu璐熻澆榪囬珮linux鐨刢pu璐熻澆
鏈嶅姟鍣–PU璐熻澆榪囬珮錛屽備綍瀹氫綅闂棰橈紵
涓涓搴旂敤鍗犵敤CPU寰堥珮錛岄櫎浜嗙『瀹炴槸璁$畻瀵嗛泦鍨嬪簲鐢ㄤ箣澶栵紝閫氬父鍘熷洜閮芥槸鍑虹幇浜嗘誨驚鐜銆侰PU璐熻澆榪囬珮瑙e喅闂棰樿繃紼嬶細
浣跨敤銆恡op銆戝懡浠ゅ畾浣嶅紓甯歌繘紼嬶紝鍙鍙戠幇12836鐨凜PU鍜屽唴瀛樺崰鐢ㄧ巼閮介潪甯擱珮
澶囨敞錛歵op鍛戒護榛樿ゆ儏鍐典笅錛屾槸姣3縐掑埛鏂頒竴嬈°備篃鍙浠ラ氳繃top-d鍒鋒柊鏃墮棿闂撮殧>鏉ユ寚瀹氬埛鏂伴戠巼錛屽倀op-d0.1鎴杢op-d0.01絳夈倀op鎵ц屾椂錛屼篃鍙浠ユ寜鈥渟鈥濋敭錛屼慨鏀規椂闂撮棿闅斻
浣跨敤銆恡op-H-p榪涚▼鍙楓戞煡鐪嬪紓甯哥嚎紼
浣跨敤銆恜rintf"%xn"綰跨▼鍙楓戝皢寮傚父綰跨▼鍙瘋漿鍖栦負16榪涘埗
浣跨敤銆恓stack榪涚▼鍙穦grep16榪涘埗寮傚父綰跨▼鍙-A90銆戞潵瀹氫綅寮傚父浠g爜鐨勪綅緗錛堟渶鍚庣殑-A90鏄鏃ュ織琛屾暟錛屼篃鍙浠ヨ緭鍑轟負鏂囨湰鏂囦歡鎴栦嬌鐢ㄥ叾浠栨暟瀛楋級銆傚彲浠ョ湅鍒板紓甯鎬唬鐮佺殑浣嶇疆銆
鎵懼埌鐩稿簲浠g爜媯鏌ワ紝鍙戠幇紜瀹炴湁姝誨驚鐜瀛樺湪銆
鎺掓煡CPU鏁呴殰鐨勫父鐢ㄥ懡浠わ細
top鍛戒護錛歀inux鍛戒護銆傚彲浠ユ煡鐪嬪疄鏃剁殑CPU浣跨敤鎯呭喌銆備篃鍙浠ユ煡鐪嬫渶榪戜竴孌墊椂闂寸殑CPU浣跨敤鎯呭喌銆
PS鍛戒護錛歀inux鍛戒護銆傚己澶х殑榪涚▼鐘舵佺洃鎺у懡浠ゃ傚彲浠ユ煡鐪嬭繘紼嬩互鍙婅繘紼嬩腑綰跨▼鐨勫綋鍓岰PU浣跨敤鎯呭喌銆傚睘浜庡綋鍓嶇姸鎬佺殑閲囨牱鏁版嵁銆
jstack錛欽ava鎻愪緵鐨勫懡浠ゃ傚彲浠ユ煡鐪嬫煇涓榪涚▼鐨勫綋鍓嶇嚎紼嬫爤榪愯屾儏鍐點傛牴鎹榪欎釜鍛戒護鐨勮緭鍑哄彲浠ュ畾浣嶆煇涓榪涚▼鐨勬墍鏈夌嚎紼嬬殑褰撳墠榪愯岀姸鎬併佽繍琛屼唬鐮侊紝浠ュ強鏄鍚︽婚攣絳夌瓑銆
pstack錛歀inux鍛戒護銆傚彲浠ユ煡鐪嬫煇涓榪涚▼鐨勫綋鍓嶇嚎紼嬫爤榪愯屾儏鍐點
『貳』 linux系統怎麼對java應用程序進行性能分析
分析CPU佔用的方法和手段:
1. top命令:可以查看實時的CPU使用情況。
2. ps -ef命令:可以查看雹凳纖進程以及進程中線程的當前CPU使用情況以及屬於當前狀態的采樣數據。
3. jstack:Java提供的命令。可以查看某個進程的當前線程棧運行情況。根據這個命令的輸出可以定位某個進程的所有線程的當前運行狀態、運行代碼,以及是否死鎖等等粗寬。
4. pstack:Linux命令。可以查看某個進程的當前線程棧運行情況
分析內存性能的方法和技巧:
1.top命令:可以查看實時的內存使用情況。
2.jmap -histo:live [pid],然後分析具體的對象源仿數目和佔用內存大小,從而定位代碼。
jmap -mp:live,format=b,file=xxx.xxx [pid],然後利用MAT工具分析是否存在內存泄漏等等。
『叄』 linux cpu使用率過高排查
方法一
第一步:使用
top命令,然後按shift+p按照CPU排序
找到佔用CPU過高的進程的pid
第二步:使用
top -H -p [進程id]
找到進程中消耗資源最高的線程的id
第三步:使用
echo 'obase=16;[線程id]' | bc或者printf "%x
" [線程id]
將線程id轉換為16進制(字母要小寫)
bc是linux的計算器命令
第四步:執行
jstack [進程id] |grep -A 10 [線程id的16進制]」
查看線程狀態信息
方法二
第一步:使用
top命令,然後按shift+p按照CPU排序
找到佔用CPU過高的進程
第二步:使用
ps -mp pid -o THREAD,tid,time | sort -rn
獲取線程信息,並找到佔用CPU高的線程
第三步:使用
echo 'obase=16;[線程id]' | bc或者printf "%x
" [線程id]
將需要的線程ID轉換為16進制格式
第四步:使用
jstack pid |grep tid -A 30 [線程id的16進制]
列印線程的堆棧信息
案例分析
場景描述
生產環境下JAVA進程高CPU佔用故障排查
解決過程
1、根據top命令,發現PID為2633的Java進程佔用CPU高達300%,出現故障。
2、找到該進程後,如何定位具體線程或代碼呢,首先顯示線程列表,並按照CPU佔用高的線程排序:
1[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn
顯示結果如下:
化主動為被動的方式,一方面減輕了運維工程師的工作,另一方面也減小了運維漏看或者忽略告警的情況發生。
『肆』 原來jdk自帶了這么好玩的工具——使用 jstack定位死循環
線程快照是java虛擬機內每一個線程正在執行的方法堆棧的集合,生成線程快照的主要目的是用於定位線程出現問題的位置;常見的問題有
命令格式
jstack的option參數並不多,真正用到的也就三個,接下來我們一個個介紹一下
- -F :當線程掛起(Suspended)時,使用jstack -l pid命令是不會列印堆棧信息的,使用-F則可以強制輸出線程堆棧;但是會停止但
- -l :列印的信息除了堆棧外,還會顯示鎖芹梁返的附加信息;
- -m :同時輸出java和C/C++的堆棧信息;在java的系統類庫裡面,有很多方法都是native修飾的,這些native修飾的方法你在java層面是看不到源碼的,因為這些方法都是C/C++實現嫌飢的;
在線程的堆棧中,需要特別留意以下幾種狀態:
不帶option參數的命令
列印結果如下
第一行各個單詞的解析,
這里我們使用2個窗口,分別使用以下2個命令來測試
通過2個窗口對比可以看到,加了-l的命令多列印了鎖的信息;
一般情況下,如果程序出錯了, 都不會直接在生產環境的伺服器上找錯誤,這個時候就可以用到一個非常實用的功能,將堆棧快照導出來,然後到別的電腦上看,命令如下
執行後,就可以看到文件已經導出來了
通過cat命令可以看到,裡面的內容和我們在命令行輸出的內容是一樣的
首先我們准備好一個死循環的線程,在線程內定一個while的死循環,並且給這個線程起個名字為:yexindogn,阿里巴巴的開發規范裡面有一個規定,就是每個線程必須起一個名字,起名字就是為了 以後程序出問題的時候好找錯誤;
接著我們將此代碼打成jar包扔到linux伺服器上運行,直接輸入 java -jar Test.jar 命令即可運行,運行後我們可以看到控制台一直在輸出112這個字元,這就代表程序已經在運行了;
接著在看下CPU的運行情況,使用top命令查看cpu佔用情況,排在第一位的是進程號為30328的進程,佔用了6.6%的cpu; 這邊我使用了2個命令行連到同一台伺服器,一個窗口用來運行剛剛的jar包,另一個窗口用來查找錯誤;
知道進程號了,接著就是找線程了,輸入以下命令
列印結果如下,這里有一點需要注意,在我們加上-Hp指令後,PID展示就是線程的id了,這時候我們看到佔用CPU最高的線程id是30365;
還有另一種方式,就是使用ps命令來查找線程
通過這個命令我們可以看到這邊佔用最高的線程id也是30365 ;
以上的方式我們成功找到了佔用cpu高的線程id是30365,但這個id是十進制的,在這里需要先轉為16進制,輸入命令
計算出對應的16進制為:769d
當然也可以用其他的計算工具,比如mac系統自帶計算器就支持進制之間的轉換
在命令行輸入以下命令,這種方法更加快速,推薦使用
其中,grep 命令是查找結果為769d的內容,-A 20 表示列印匹配所在行的後20行內容。直接幫我們定位到所在線程的堆棧,結果如下
當然也可以用下面的死辦法,先列印出所有的堆棧快照;
列印結果如下
接著我用剛剛計算出來的16進制復制出來在這里搜索一下,經過查看就知道是我們剛剛起了名字為yexindong的線程出錯了,出錯的位置在Test.java的第13行代碼
我們看看java代碼,確實是第13行這里的死循環導致的
首先打開任務管理器,因為默認windows的任務管理器是不顯示進程pid的,所以我們需要設置一下,選擇 查看 選擇列(S)...
選中PID進程表示符後點擊確定按鈕
然後我們就可以看到佔用CPU最高的java進程PID為:976
因為windows不能直接查看java進程中的線程信息,所以我們需要藉助一個工具,渣指這個工具是微軟自己開發的,叫做Process Explorer ,網上很多,需要的童鞋請自行網路,打開後找到pid為976的進程右擊選擇 屬性
在彈出的窗口中找到線程這一欄,它的排序默認就是按照cpu佔用的率倒序排列的,所以最上面的就是佔用cpu最高的線程了,記住它的線程id:3548
剛剛拿到的進程id是十進制的,但是我們導出的jstack信息裡面,線程id是以16進制來展示的,所以我們要先將這個線程id為3548轉為16進制的,使用windows自帶的計算器即可,在快捷命令行輸入calc
計算器打開後將其設置為程序員使用的計算器
接著輸入線程id3548,在按一下16進制,就會自動進行轉換,結果為ddc,記住這個16進制;
在命令行輸入以下指令導出進程的堆棧快照信息
幾秒鍾後,快照導出了,靜靜地躺在文件夾里,等待著我們打開
用Notepad++打開導出的文件,搜索剛剛計算出來的16進制ddc,就可以定位到線程出錯的位置了
有些童鞋可能會覺得用這個jstack命令麻煩了,那java在代碼裡面可不可以列印出堆棧呢?你別說,還真有,就是這個方法:Thread.getAllStackTraces();光說不練假把式,來個demo測試一下吧
執行後列印結果如下,由此可以看到,將當前進程的所有線程都列印出來了,但是這邊只列印了簡單的堆棧信息,對於開發人員來說,已經起到了監控作用;
作為調優和找錯的工具來說,可以說jstack是用的最多的一個工具了,但是由於局限性,現在已經慢慢被替換掉了;大家更傾向於使用阿里巴巴開發的工具arthas;感興趣的童鞋可以了解下!
『伍』 【26期】內存持續上升,如何排查
當內存持續上升時,可以採取以下方法和工具進行排查:
1. 使用Linux命令行工具
top命令:使用top命令實時顯示進程的CPU和內存使用情況。通過top Hp pid可以查看特定線程的資源佔用情況,幫助識別哪些線程或進程佔用了大量內存。
vmstat命令:雖然vmstat主要用於觀察進程的上下文切換,但它也能提供系統的內存和CPU使用情況,有助於了解整體資源狀況。
pidstat命令:通過pidstat p pid r 1 3等參數,可以深入到線程級別監測內存使用情況,進一步細化問題定位。
2. 針對Java應用的工具
jstat命令:對於Java應用,jstat可以實時監控堆內存和垃圾回收情況,幫助識別內存泄漏或垃圾回收效率低下的問題。
jmap命令:jmap用於查看堆內存配置和詳細使用情況。通過jmap histo[:live] pid可以查看對象的統計信息,有助於識別哪些對象佔用了大量內存。
jstack命令:jstack用於分析線程堆棧,有助於排查死鎖問題。雖然它主要關注線程狀態,但有時線程狀態也能間接反映內存使用情況。
總結:
- 排查內存問題需要綜合運用多種工具和方法。
- 在Linux環境下,top、vmstat和pidstat等命令行工具是常用的內存監控和分析手段。
- 對於Java應用,jstat、jmap和jstack等工具則提供了更深入的內存分析和線程堆棧分析功能。
- 排查過程可能需要結合源碼分析,並不斷學習和實踐,才能准確找出問題根源。