jps 命令相似與 linux 的 ps 命令,可是它只列出系統中全部的 Java 應用程序。 經過 jps 命令能夠方便地查看 Java 進程的啓動類、傳入參數和 Java 虛擬機參數等信息。java
-q:只輸出進程 ID
-m:輸出傳入 main 方法的參數
-l:輸出徹底的包名,應用主類名,jar的徹底路徑名
-v:輸出jvm參數
-V:輸出經過flag文件傳遞到JVM中的參數linux
一、jps 顯示進程的ID 和 類的名稱
服務器
二、jps -q 只輸出進程ID,而不顯示出類的名稱
jvm
三、jps -m 能夠輸出傳遞給 Java 進程(main 方法)的參數
四、jps -l 能夠輸出主函數的完整路徑(類的全路徑)
五、 jps -v 能夠顯示傳遞給 Java 虛擬機的參數
ide
jps 支持查看遠程服務上的 jvm 進程信息。若是須要查看其餘機器上的 jvm 進程,須要在待查看機器上啓動 jstatd 服務。函數
jstack是jdk自帶的線程堆棧分析工具,使用該命令能夠查看或導出 Java 應用程序中線程堆棧信息。工具
舉例:若是CPU負荷達到100%,咱們如何排查?線程
top -Hp 23344(進程ID)
這裏注意:
jstack命令生成的thread dump信息包含了JVM中全部存活的線程,爲了分析指定線程,必須找出對應線程的調用棧,應該如何找?code
能夠看到,jstack裏面,每個線程都對應一個nid,這個nid是16進制的。
一、把要查看的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(); } }
兩個線程在互相等待另外一個線程的鎖!!