Java性能調優-jstack-jstat-jmap

0. 必須在java進程的用戶下執行

a). 先排查本身業務代碼,再第三方的開源代碼
b). 工具類都在jdk/bin目錄下, 實現代碼在tools.jar中

1. jstack-線程快照-死鎖/阻塞

ps aux | grep tomcat
./jstack 2129

1.1 線程狀態--死鎖和阻塞

//在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.死循環定位]

2.1使用jstack定位

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.內存泄漏定位

相關文章
相關標籤/搜索