JVM (三) 常用排查命令工具
-
jps 虛擬機進程狀況工具
jps(JVM Process Status Tool)它的功能也和ps命令類似:可以列出正在運行的虛擬機進 程,並顯示虛擬機執行主類(Main Class,main()函數所在的類)名稱以及這些進程的本地虛擬機唯一 ID(LVMID,Local Virtual Machine Identifier)。
命令格式
jps [ options ] [ hostid ]
列子^Croot@yut5:~# jps -l 30113 admin2.0.jar 12488 sun.tools.jps.Jps 30313 admin2.0.jar
-
jinfo java配置信息工具
jinfo(Configuration Info for Java)的作用是實時查看和調整虛擬機各項參數。
可以使用-flag[+|-]name或者-flag name=value在運行期修改一部分運行期可寫的 虛擬機參數值
命令格式
jinfo [ option ] pid
例子
查詢最大堆大小 502m 和 線程棧內存爲 1mroot@yut5:~# jinfo -flag MaxHeapSize 30113 -XX:MaxHeapSize=526385152 root@yut5:~# jinfo -flag ThreadStackSize 30113 -XX:ThreadStackSize=1024
jinfo -flags 30113 可以查看應用下的vm配置。
-
jmap:Java內存映像工具
jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般稱爲heapdump或dump文件)。
jmap的作用並不僅僅是爲了獲取堆轉儲快照,它還可以查詢finalize執行隊列、Java堆和方法區的 詳細信息,如空間使用率、當前用的是哪種收集器等。命令格式
jmap [ option ] vmid
例子
查看堆信息root@yut5:~# jmap -heap 30113 Attaching to process ID 30113, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.242-b08 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 526385152 (502.0MB) NewSize = 11141120 (10.625MB) MaxNewSize = 175439872 (167.3125MB) OldSize = 22413312 (21.375MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB)
-
jstack:Java堆棧跟蹤工具
jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照(一般稱爲threaddump或者 javacore文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的 目的通常是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間掛 起等,都是導致線程長時間停頓的常見原因。線程出現停頓時通過jstack來查看各個線程的調用堆棧, 就可以獲知沒有響應的線程到底在後臺做些什麼事情,或者等待着什麼資源。
命令格式
jstack [ option ] vmid
例子
太多隻粘貼一部分jstack -l 30113 2020-05-14 16:44:18 Full thread dump OpenJDK 64-Bit Server VM (25.242-b08 mixed mode): "Attach Listener" #42 daemon prio=9 os_prio=0 tid=0x00007f1b20004000 nid=0x6da6 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "DestroyJavaVM" #41 prio=5 os_prio=0 tid=0x00007f1b4800a800 nid=0x75a2 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None
從JDK 5起,java.lang.Thread類新增了一個getAllStackTraces()方法用於獲取虛擬機中所有線程的 StackTraceElement對象。使用這個方法可以通過簡單的幾行代碼完成jstack的大部分功能,在實際項目 中不妨調用這個方法做個管理員頁面,可以隨時使用瀏覽器來查看線程堆棧,
-
jstat:虛擬機統計信息監視工具
jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機各種運行狀態信息的命令行工具。它可 以顯示本地或者遠程[1]虛擬機進程中的類加載、內存、垃圾收集、即時編譯等運行時數據,在沒有 GUI圖形界面、只提供了純文本控制檯環境的服務器上,它將是運行期定位虛擬機性能問題的常用工 具。
-
jhat:虛擬機堆轉儲快照分析工具
JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。 jhat內置了一個微型的HTTP/Web服務器,生成堆轉儲快照的分析結果後,可以在瀏覽器中查看。不過 實事求是地說,在實際工作中,除非手上真的沒有別的工具可用,否則多數人是不會直接使用jhat命令 來分析堆轉儲快照文件的,主要原因有兩個方面。一是一般不會在部署應用程序的服務器上直接分析 堆轉儲快照,即使可以這樣做,也會盡量將堆轉儲快照文件複製到其他機器[1]上進行分析,因爲分析 工作是一個耗時而且極爲耗費硬件資源的過程,既然都要在其他機器上進行,就沒有必要再受命令行 工具的限制了。另外一個原因是jhat的分析功能相對來說比較簡陋。