Java命令行監控工具(jmap,jstack,jstat,jinfo,jps)

項目部署上線以後,線上項目是不能輕易修改的,定位問題的難度也會變大。所以監控是很是重要的一個環節,有了監控,咱們才能更好的定位系統中的問題,從而排查。監控的工具備不少種, 可是java自帶的命令行監控工具,是必需要掌握的。html

jps

查看系統中jvm進程, 其它的命令一般先使用jps查看進程號,而後在根據線程號獲取jvm進程信息 java

image.png

jps -m 查看jvm進程而且帶有參數查看 jps -v 查看傳遞到jvm的參數oracle

官方jps解釋:docs.oracle.com/javase/7/do…jvm

jstat

顯示JVM的性能統計信息, 常見用法:jstat -ide

image.png

解釋下-gc選項中列的含義:-gc查看垃圾收集器中的信息, 主要包含jvm的運行時數據區統計。 後綴爲C的表明當前區的容量,後綴爲U的表明已經使用了多少容量,後綴爲T的表明耗時工具

S0C 存活區0的容量(KB) S1C 存活區1的容量(KB) S0U 存活區0使用的空間 (KB). S1U 存活區1的利用空間 (KB). EC Eden區的容量(KB). EU Eden區利用的容量(KB). OC 老年代容量(KB). OU 老年代使用容量(KB). PC 當前永久帶的容量(KB). PU 永久帶使用容量(KB). YGC 發生了多少次Young GC YGCT Young GC的時間 FGC Full GC的次數 FGCT Full GC的收集時間 GCT 總共的GC時間.性能

官方jstat解釋:docs.oracle.com/javase/7/do…學習

jstack

查看線程堆棧信息,在發生死鎖的時候能夠利用這個命令查找死鎖或者在發生死循環的時候利用此命令排查。網站

jstack vmpid 會打印線程的堆棧信息。經過堆棧能夠查看具體線程正在執行那些代碼,廈門演示兩個使用jstack排查死鎖與死循環的命令。spa

死鎖代碼:

public class DeadLock {

    private static Object o1 = new Object();
    private static Object o2 = new Object();
    private static CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {
        new Thread(){
            @Override
            public void run() {
                synchronized (o1){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程1 得到鎖1");
                    synchronized (o2){
                        System.out.println("線程1 得到鎖2");
                        countDownLatch.countDown();
                    }
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                synchronized (o2){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程2 得到鎖2");
                    synchronized (o1){
                        System.out.println("線程2 得到鎖1");
                        countDownLatch.countDown();
                    }
                }
            }
        }.start();

        countDownLatch.await();
        System.out.println("執行完畢");
        
    }

}
複製代碼

死鎖以後: 能夠看到jstack已經幫咱們找到了死鎖。

image.png
image.png

死循環須要配合Top命令一塊兒使用,死循環會致使CPU不斷的飆升,這時候使用top命令,查看cpu佔用率較高的命令:

image.png

使用top -H -p 24278 查看進程中具體是那一條線程的CPU利用率高

image.png

能夠看到是24279的線程,在top中使用的是10進制,在jstack中打印的線程是16進制,所以作一次轉換。 24279 => 5ed7 而後查看線程:

image.png

而後咱們能夠知道具體那一行的指令在一直運行。

jstack官方文檔解釋

jinfo查看JVM啓動時候設置的參數值

jinfo能夠查看當前JVM線程配置的系統屬性,以及運行時設置的參數值。

直接使用jinfo

  1. 前半段是系統的屬性

    image.png

  2. 後半段是jvm的參數

    image.png

咱們也能夠直接使用jinfo查看具體的某個參數值:

image.png

jinfo官方解釋

jmap分析堆

在發生OME的時候,會用jmap分析堆中具體是什麼問題,才能更好的解決問題。jmap通常和mat配合使用。

通常在java開發的項目啓動時候,最好加上下面命令,在內存溢出的時候能夠經過日誌查看信息。 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/dump

固然在項目運行的時候也可使用jmap -heap jvmpid查看對象內存的映射。

演示內存溢出

堆內存溢出代碼

public class DealCycle {
    public static LinkedList<Integer> linkedList = new LinkedList<>();
    public static void main(String[] args) {
        int i = 0;
        while (true){
            linkedList.add(i);
        }
    }
}
複製代碼

運行:

image.png

你們能夠去網站上下載java mat的二進制壓縮包,學習一下

在線分析hprof文件: heaphero.io/

image.png

image.png

若是每次都等到內存溢出才導出文件時間就有些晚了,可使用jmap直接導出

image.png

jmap官方解釋

最後

這篇文章主要介紹了java自帶的命令行工具,經過這些命令行工具,咱們能夠很好的得知當前jvm的運行狀態。

相關文章
相關標籤/搜索