title: 如何找到佔用CPU和內存最高的線程
date: 2017-03-01
tags: java
一、如何找到CPU和內存佔用最高的線程
代碼示例
我們先來寫一段代碼
@Test public void testLinuxTop() throws Exception{ boolean b=true; System.out.println("start the cpu Thread"); while (b){ int i=(int)Math.random()*1000; if (i%3==1){ } if (i==1000){ System.out.println("stop"); b=false; } } }
隨便寫了個死循環,然後怎麼看下CPU佔用情況呢?
TOP命令
先用
ps -ef|grep tomcat
查看一下你當前tomcat的進程號,比如我看出來我的進程號是8545然後用TOP命令查看當前所有進程
top -p 8545 top -p 8545 -H //這樣也可以
使用地址中,進入了下面這個界面之後就要按H了
於是你就會看到下面這張圖片
CPU佔用接近滿了,內存佔用30M,怎麼會佔用這麼多?OK,我們記住PID 8545
jstack命令
OK,我們在棧裏面來找出這段代碼,可以直接用jstack把棧裏面的東西打出來
直接使用下面的就可以
jstack 8545 > stack.log
在你的當前目錄下面就會出現一個stack.log文件,這是包括所有的棧信息的,這裏的8545是tomcat的進程號、tomcat的進程號、tomcat的進程號,重要的事情強調一下如何找到有問題的代碼呢?
我們剛纔拿到了一個CPU最高的進程號8545,OK,轉化爲16進制,使用下面命令
printf "%x\n" 8545 //或者 printf 0x%x 8545
上面兩種都可以拿到16進制的8545,或者你自己去用計算器拿去,這裏我們得到的是0x2162或者2161(上面一種可以直接拿到2161,沒有0x),我們要的就是2161
可以直接到jstack.log文件裏面去搜索,就看到出問題的代碼了
想直接看
下面提供一種直接看的方法
jstack 8545|grep -A 30 2162
得到線程堆棧信息中2162這個線程所在行的後面30行
question
4.1 我使用jstack pid報錯了怎麼辦?
使用jstack pid可能會出現8545 operation permitted之類的錯誤,解決辦法,請切換至root用戶執行命令
over