問題排查-jps和jstack

jps

jps 命令相似與 linux 的 ps 命令,可是它只列出系統中全部的 Java 應用程序。 經過 jps 命令能夠方便地查看 Java 進程的啓動類、傳入參數和 Java 虛擬機參數等信息。java

問題排查-jps和jstack

參數說明:

-q:只輸出進程 ID
-m:輸出傳入 main 方法的參數
-l:輸出徹底的包名,應用主類名,jar的徹底路徑名
-v:輸出jvm參數
-V:輸出經過flag文件傳遞到JVM中的參數linux

一、jps 顯示進程的ID 和 類的名稱
問題排查-jps和jstack服務器

二、jps -q 只輸出進程ID,而不顯示出類的名稱
問題排查-jps和jstackjvm

三、jps -m 能夠輸出傳遞給 Java 進程(main 方法)的參數
問題排查-jps和jstack
四、jps -l 能夠輸出主函數的完整路徑(類的全路徑)
問題排查-jps和jstack
五、 jps -v 能夠顯示傳遞給 Java 虛擬機的參數
問題排查-jps和jstackide

獲取遠程服務器 jps 信息

jps 支持查看遠程服務上的 jvm 進程信息。若是須要查看其餘機器上的 jvm 進程,須要在待查看機器上啓動 jstatd 服務。函數

jstack

jstack是jdk自帶的線程堆棧分析工具,使用該命令能夠查看或導出 Java 應用程序中線程堆棧信息。工具

舉例:若是CPU負荷達到100%,咱們如何排查?線程

一、使用top命令查找到佔用cpu最多的java進程。

二、使用下面的命令查看,java進程中,佔用cpu最多的線程

top -Hp 23344(進程ID)

三、而後使用jstack pid查看,這個佔用cpu最多的線程狀況。

這裏注意:
jstack命令生成的thread dump信息包含了JVM中全部存活的線程,爲了分析指定線程,必須找出對應線程的調用棧,應該如何找?code

能夠看到,jstack裏面,每個線程都對應一個nid,這個nid是16進制的。
問題排查-jps和jstack
一、把要查看的pid轉換成16進制,進行匹配便可找到要查看的線程的信息。
二、而後能夠多打印幾回jstack信息,這樣找到這個線程在哪一段代碼,出現的頻率最高,而後查看線程狀態。blog

三、在dump中,線程通常存在以下幾種狀態:
3.一、RUNNABLE,線程處於執行中
3.二、BLOCKED,線程被阻塞
3.三、WAITING,線程正在等待

四、舉例:死鎖

package com.jane;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class Main {

    public static void main(String[] args) {
        ReentrantLock lock1 = new ReentrantLock();
        ReentrantLock lock2 = new ReentrantLock();

        Thread t1 = new Thread() {
            @Override
            public void run() {
                try {
                    lock1.lock();
                    TimeUnit.SECONDS.sleep(1);
                    lock2.lock();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread t2 = new Thread() {
            @Override
            public void run() {
                try {
                    lock2.lock();
                    TimeUnit.SECONDS.sleep(1);
                    lock1.lock();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t1.setName("mythread1");
        t2.setName("mythread2");
        t1.start();
        t2.start();

    }
}

問題排查-jps和jstack

問題排查-jps和jstack

兩個線程在互相等待另外一個線程的鎖!!

相關文章
相關標籤/搜索