天天看點

JDK的指令行工具一、jps:虛拟機程序狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

目錄

一、jps:虛拟機程序狀況工具

二、jstat:虛拟機統計資訊監視工具

三、jinfo:java配置資訊工具

四、jmap:java記憶體映像工具

五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可

六、jstack:java堆棧跟蹤工具

使用jstack檢視線程死鎖——模拟

一、jps:虛拟機程序狀況工具

linux自帶檢視程序指令:

  • ps -ef | grep java  檢視運作的java程序

jps是jdk提供的一個檢視目前java程序的小工具。查找目前使用者的Java程序,而不是目前系統中的所有程序。

參數如下

  • jps -l 輸出主類或jar的完全路徑
JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具
  • jps -v 輸出jvm 的參數
JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具
  • jps -m 輸出main方法的參數
  • jps -q 隻顯示程序id。不顯示類名

二、jstat:虛拟機統計資訊監視工具

jstat是用于監視虛拟機各種運作狀态資訊的指令行工具。

  • jstat -gc 2764 250 20

上述指令的解釋是,沒250毫秒查詢一次程序2764的垃圾收集狀況,一共查詢20次,省略後邊兩個參數,說明隻查詢一次,通常和jps指令結合使用。

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

相關監視選項含義:

  • S0C:第一個幸存區的大小
  • S1C:第二個幸存區的大小
  • S0U:第一個幸存區的使用大小
  • S1U:第二個幸存區的使用大小
  • EC:伊甸園區的大小
  • EU:伊甸園區的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法區大小
  • MU:方法區使用大小
  • CCSC:壓縮類空間大小
  • CCSU:壓縮類空間使用大小
  • YGC:年輕代垃圾回收次數
  • YGCT:年輕代垃圾回收消耗時間
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

三、jinfo:java配置資訊工具

jinfo 是 JDK 自帶的指令,可以用來檢視正在運作的 java 應用程式的擴充參數,包括Java System屬性和JVM指令行參數;也可以動态的修改正在運作的 JVM 一些參數。當系統崩潰時,jinfo可以從core檔案裡面知道崩潰的Java應用程式的配置資訊。

jinfo的用法:

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具
  • jinfo pid :輸出目前 jvm 程序的全部參數和系統屬性
JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

四、jmap:java記憶體映像工具

jmap指令可以獲得運作中的jvm的堆的快照,進而可以離線分析堆,以檢查記憶體洩漏,檢查一些嚴重影響性能的大對象的建立,檢查系統中什麼對象最多,各種對象所占記憶體的大小等等。可以使用jmap生成Heap Dump。 

JVM Memory Map指令用于生成heap dump檔案,如果不使用這個指令,還可以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛拟機出現OOM的時候自動生成dump檔案。 jmap不僅能生成dump檔案,還可以查詢finalize執行隊列、Java堆和永久代的詳細資訊,如目前使用率、目前使用的是哪種收集器等。

  • jmap -heap pid :檢視相應程序堆資訊情況,如使用哪種回收器,參數配置,分代狀況等。
JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具
  • jmap -histo 9740 | more : 檢視堆中對象統計資訊,包括類、執行個體數量,合計容量等。

上示指令中,more是管道符下的分頁指令,進行分頁檢視

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具
  • jmap -dump:format=b,file=C:\Users\swadi\Desktop\dump.bin 9740 :生成堆轉儲快儲快照到桌面

C:\Users\swadi\Desktop\ :本機桌面位址

dump.bin:檔案名稱

9740 :程序pid

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可

Java Virtual Machine Heap Analysis Tool 虛拟機堆轉儲快照分析工具,用于分析heapdump檔案,它會建立一個HTTP/HTML伺服器,讓使用者可以在浏覽器上檢視分析結果。

不過,在實際工作中,除非真的沒有别的工具可用,否則一般不會去直接使用jhat指令來分析demp檔案,主要原因有二:一是一般不會在部署應用程式的伺服器上直接分析dump檔案,即使可以這樣做,也會盡量将dump檔案拷貝到其他機器上進行分析,因為分析工作是一個耗時且消耗硬體資源的過程,既然都要在其他機器上進行,就沒必要受到指令行工具的限制了;另外一個原因是jhat的分析功能相對來說很簡陋,VisualVM以及專門分析dump檔案的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能實作比jhat更強大更專業的分析功能。

測試用例:執行下列程式

public class OOMErrorTest {
    public static void main(String[] args) {
        String str = "classOOM";
        for(int i = 0;i<999999999;i++){
            str += str;
            System.out.println(str);
        }
    }
}
           

給定虛拟機運作參數:

-Xmx10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\swadi\Desktop\
           

運作結果:

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

執行完後,程式堆記憶體溢出,此時在桌面生成了一個記憶體分析檔案,使用jhat指令,可生成一個連結位址,如圖:

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

使用連結位址,可檢視記憶體溢出的相關資訊:

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

六、jstack:java堆棧跟蹤工具

jstack是jdk自帶的線程堆棧分析工具,使用該指令可以檢視或導出 java 應用程式中線程堆棧資訊。

jstack用于生成java虛拟機目前時刻的線程快照。線程快照是目前java虛拟機内每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導緻的長時間等待等。 線程出現停頓的時候通過jstack來檢視各個線程的調用堆棧,就可以知道沒有響應的線程到底在背景做什麼事情,或者等待什麼資源。 如果java程式崩潰生成core檔案,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,進而可以輕松地知道java程式是如何崩潰和在程式何處發生問題。另外,jstack工具還可以附屬到正在運作的java程式中,看到當時運作的java程式的java stack和native stack的資訊, 如果現在運作的java程式呈現hung的狀态,jstack是非常有用的。

  • jstack -l pid 檢視線程堆棧資訊
JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

使用jstack檢視線程死鎖——模拟

在springboot啟動類中模仿一個線程死鎖,開啟springboot工程,代碼如下:

@SpringBootApplication
@EnableScheduling // 開啟定時任務
public class MyApplication {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(MyApplication.class);
        try {
            SpringApplication.run(MyApplication.class);
            logger.info("springBoot啟動成功...");
        } catch (Exception e) {
            logger.info("SpringBoot啟動失敗...");
        }
    }

    public static Object lock1 = new Object();
    public static Object lock2 = new Object();

    /**
     * 在springboot項目啟動的時候所執行的方法
     * 在bean加載完但使用者線程進來之前執行的方法
     */
    @PostConstruct
    public void deadLock(){
        new Thread(()->{
            synchronized (lock1){
                try {
                    System.out.println(Thread.currentThread().getName()+":get lock1");
                    Thread.sleep(3000L);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println(Thread.currentThread().getName()+":get lock2");
                }
            }
        },"Thread1").start();
        new Thread(()->{
            synchronized (lock2){
                try {
                    System.out.println(Thread.currentThread().getName()+":get lock2");
                    Thread.sleep(3000L);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println(Thread.currentThread().getName()+":get lock1");
                }
            }
        },"Thread2").start();
    }
}
           

執行完後,通過jstack指令檢視線程狀态:

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具

往下翻,線上程堆棧資訊中,我們可以看到列印的死鎖資訊,如圖:

JDK的指令行工具一、jps:虛拟機程式狀況工具二、jstat:虛拟機統計資訊監視工具三、jinfo:java配置資訊工具四、jmap:java記憶體映像工具五、jhat:虛拟機堆轉儲快照分析工具——僅做了解即可六、jstack:java堆棧跟蹤工具