(補(bǔ)充說明:其實(shí)top看不出來是哪個(gè)進(jìn)程区拳,是因?yàn)樽约核讲司辛欤胻op -H或者top進(jìn)去后意乓,輸入H就可以根據(jù)線程來查看,這樣就能發(fā)現(xiàn)cpu占用高的線程了)
今天發(fā)現(xiàn)一臺(tái)機(jī)器cpu跑高了,第一時(shí)間用top查看
并沒有發(fā)現(xiàn)占用cpu高的進(jìn)程届良,但是cpu使用的確很高笆凌。
使用另外一個(gè)命令htop
使用htop發(fā)現(xiàn)是一個(gè)pid為32442的進(jìn)程占用了100%的cpu,按后面的運(yùn)行參數(shù)士葫,并根據(jù)自身的業(yè)務(wù)乞而,可以判斷這是一個(gè)業(yè)務(wù)進(jìn)程的其中一個(gè)線程。
使用ps命令查看業(yè)務(wù)進(jìn)程pid慢显,查出來是31519
先計(jì)算線程的16進(jìn)制的值
printf "%x\n" 32442
7eba
然后用jstack pid將堆棧信息打印出來
jstack 31519 | grep 74ba -B 15 -A 15
堆棧信息打印出來后爪模,就交給開發(fā)來處理了。
注:
使用jstack的時(shí)候報(bào)了個(gè)錯(cuò)荚藻,
Unable to open socket file: target process not responding or HotSpot VM not loaded
原因如下:
jvm運(yùn)行時(shí)會(huì)生成一個(gè)目錄hsperfdata_$USER($USER是啟動(dòng)java進(jìn)程的用戶),在linux中默認(rèn)是/tmp,目錄下會(huì)有些pid文件,存放jvm進(jìn)程信息,而jmap,jstack等工具會(huì)讀取/tmp/hsperfdata_$USER下的pid文件獲取連接信息屋灌。所以需要運(yùn)行這個(gè)jvm的用戶來執(zhí)行jstack命令
我這邊使用tomcat用戶來運(yùn)行的,所以需要切換到tomcat用戶來執(zhí)行jstack即可