天天看點

深入淺出JVM之線上虛拟機工具

  1. jps

    JVM Process Status Tool是其中典型的jvm工具,除了名字像Unix的ps指令之外,它的功能也和ps指令類似,可以列出正在運作的虛拟機程序,并顯示虛拟機正在執行主類(Main Class、main()函數所在的類)名稱以及這些程序本地虛拟機唯一id,雖然功能比較單一,但它是使用頻率最高的JDK指令工具。

    1. jps 檢視pid
      深入淺出JVM之線上虛拟機工具
    2. jps -l 展示類的全限定名,如果程序執行的是jar包,則輸出jar路徑
      深入淺出JVM之線上虛拟機工具
    3. jps -m 展示jvm啟動類名
      深入淺出JVM之線上虛拟機工具
    4. jps -m 展示jvm啟動參數
      深入淺出JVM之線上虛拟機工具
  2. jstat(JVM Statictics Monitoring Tool)是用于監視各種運作狀态資訊的指令工具,它可以顯示本地或者遠端虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,在沒有GU圖形界面,隻提供了純文字控制台環境的伺服器上,它将是運作期定位虛拟機性能問題的首選工具
  3. jstat指令使用:

    jstat -gc pid 間隔時間 列印次數

    jstat -gc 51020 250 20 每隔250毫秒列印一次,一共20次

    S0C 第一個幸存區的大小

    S1C 第二個幸存區的大小

    S0U 第一個幸存區實際使用的大小

    S1C 第二個幸存區實際使用的大小

    EC Eden區的大小

    EU Eden區實際使用的大小

    OC 老年代大小

    OU 老年代實際使用的大小

    MC 方法區大小

    MU 方法區實際使用的大小

    CCSC 壓縮類空間大小

    CCSU 壓縮類空間實際使用大小

    YGC 年輕代垃圾回收此時

    YGCT 年輕代垃圾回收消耗時間

    FGC 老年代垃圾回收次數

    FGCT 老年代垃圾回收消耗時間

    GCT 垃圾回收總消耗時間

  4. jinfo(Configuretion Info For Java)的作用是實時的檢視和調整虛拟機各項參數。使用jps -v可以檢視虛拟機啟動時顯示指定的參數清單,但如果想知道未被顯示指定的參數的系統預設值,除了去找資料外,就隻能使用jinfo 的 -flag選項進行查詢了。
  5. jinfo指令使用

    jinfo -flag CMSInititingOccupancyFraction 1444

  6. jmap(Memory Map For Java)指令用于生成堆棧存儲快照。如果不使用jmap指令,想要擷取Java堆棧存儲快照,還有一些暴力的手段-XX:+HeapDumpOnOutOfMemoryError參數,可以讓虛拟機在OOM異常時生成Dump檔案,用于系統複盤。

    和info指令一樣,jmap有不少功能在Windows平台下時受限的,出了生成dump檔案的-dump選項和用于檢視每個類的執行個體、空間占用統計的-histo選項在所有作業系統都提供之外,其餘選項都隻能在Linux/Solaris下使用。

  7. jmap指令使用

    jmap -dump 生成Java堆棧存儲快照,格式為jmap -dump: format=b,file=

    jmap -histo 顯示堆中對象統計資訊,包括類、執行個體數量、合計容量(分頁檢視)

    jmap -heap 13388

  8. jhat(JVM Heap Analysis Tool)指令常與jmap搭配使用,來分析jmap生成的堆棧存儲快照,jhat内置了一個微型的HTTP/HTML伺服器,生成Dump檔案分析的結果後可以在浏覽器中檢視(localhost:7000)。
  9. jhat特點
    1. jhat分析工作是一個耗時且耗硬體資源的過程
    2. jhat的分析功能相對來說比較簡陋
  10. jhat的使用

    jhat 檔案名稱

  11. jstack(Stack Trace for Java)指令用于生成虛拟機目前時刻的線程快照(一般稱為threaddump或者javacore檔案)
  12. 線程快照就是目前虛拟機内每一條線程正在執行的方法堆棧集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因。如線程死鎖、死循環、請求外部資源導緻長時間的等待等。線程出現停頓的時候通過jstack來檢視各線程的調用堆棧,就可以知道沒有響應的線程到底在背景做些什麼事情,或者等待着什麼資源。
  13. 線上程式一般不能用kill程序pid的方式直接關閉
  14. jstack的用法
    1. jstack -l pid
    2. jstack -f 當正常輸出的請求不被響應時,強制輸出線程堆棧force
  15. 線程狀态
    1. NEW 線程建立
    2. RUNNABLE 線程.start,執行狀态
    3. BLOCKED 阻塞狀态
    4. WAITING 等待狀态,一個正在無限期等待另一個線程執行一個特别動作的線程處于 這一狀态
    5. TIMED_WAITING 正在限時等待另一個線程執行一個動作
    6. TERMINATED 線程銷毀
  16. BLOCKED與WAITING狀态的差別

    WAITING是主動的顯示的申請的阻塞,BLOCKED屬于被動的阻塞