0. 必須在java進程的用戶下執行
a). 先排查本身業務代碼,再第三方的開源代碼
b). 工具類都在jdk/bin目錄下, 實現代碼在tools.jar中
1. jstack-線程快照-死鎖/阻塞
ps aux | grep tomcat
./jstack 2129
//在java.lang.Thread.State中定義
NEW 線程建立未啓動
RUNNABLE 正常運行中
TERMINATED 線程已執行完畢
TIMED_WAITING 這個狀態就是有限的(時間限制)的WAITING, 通常出如今調用wait(long), join(long)等狀況下, 另一個線程sleep後, 也會進入TIMED_WAITING狀態
BLOCKED 線程在等待進入臨界區(Synchronized) //重點關注
WAITTING 這個狀態下是指線程擁有了某個鎖以後, 調用了他的wait方法, 等待其餘線程/鎖擁有者調用 notify / notifyAll 一遍該線程能夠繼續下一步操做;
線程調用了join方法 join了另外的線程的時候, 也會進入WAITING狀態, 等待被他join的線程執行結束
[2.死循環定位]
a). 先top定位消耗CPU最高的進程
b). top -Hp 12862 //查看進程下哪一個線程佔用資源最多
c). 定位到12907這個線程 把它轉化成16進制是 326b
d). 用 jstack -l 12862 > jstack.log; 生成線程堆棧日誌文件
e). 打開jstack.log文件 搜索0x326b
"pool-3-thread-2" prio=10 tid=0x00007fb780235000 nid=0x326b runnable [0x00007fb7c89c2000]
java.lang.Thread.State: RUNNABLE
at com.elasticsearch.river.kafka.KafkaRiver$UpLoadFileWorker.run(KafkaRiver.java:303)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Locked ownable synchronizers:
- <0x00000000f04077f8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
定位到死循環的代碼塊,緣由是沒有sleep....
//示例代碼
public class CpuTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
while (true) {
System.out.println("asdasdasd");
}
}
}
"main" #1 prio=5 os_prio=0 tid=0x000000000060a000 nid=0x6614 runnable [0x00007f1879e43000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x0000000084e150d8> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:482)
- locked <0x0000000084e032b0> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
- locked <0x0000000084e03268> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.newLine(PrintStream.java:546)
- eliminated <0x0000000084e032b0> (a java.io.PrintStream)
at java.io.PrintStream.println(PrintStream.java:807)
- locked <0x0000000084e032b0> (a java.io.PrintStream)
at CpuTest.main(CpuTest.java:8)
Locked ownable synchronizers:
- None
3.內存泄漏定位