天天看點

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

思維導圖

概述

指令行工具

jps 虛拟機程序狀況工具

文法及使用

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

jinfo Java配置資訊工具

jmap Java 記憶體映射工具

jhat 虛拟機堆轉儲快照分析工具

jstack Java堆棧跟蹤工具

hsdis:jit生成代碼反彙編

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

前面介紹了虛拟機的記憶體配置設定和回收,大緻有了一些理論基礎,接下來我們從實踐的角度去了解虛拟機記憶體管理。定位問題的時候,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的手段。

這裡我們說的資料主要包括

運作日志

異常堆棧

GC日志

線程快照(thread dump / javacore檔案)

堆轉儲快照(heapdump/hprof檔案)等

Java安裝目錄 bin目錄下有很多官方提供的指令行程式,今天我們倆了解下虛拟機性能監控與故障處理工具

名稱

英文全稱

作用

jps

JVM Process Status Tool

顯示指定系統内所有的HotSPot虛拟機程序

jstat

JVM Statistics Monitoring Tool

用于手機HotSpot虛拟機個方面的運作資料

jinfo

Configuration Info for Java

顯示虛拟機配置資訊

jmap

Memory Map for Java

生成虛拟機的記憶體轉儲快照(headump檔案)

jhat

Java Heap Analysis Tool

虛拟機堆轉儲快照分析工具

jstack

Stack Trace For Java

java堆棧跟蹤工具,,顯示線程快照

Java Virtual Machine Process Status Tool

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

不僅名字像unix主機的ps指令,功能也相似,可以列舉出正在運作的虛拟機程序,并顯示虛拟機執行主類(Main Class,main函數所在的類)名稱以及這些程序的本地虛拟機唯一ID(Local Virtual Machine Identifier ,LVMID)。.

使用頻率最高的JDK指令行工具,以為内其他的JDK工具大多需要輸入它查詢到LVMID來确定要監控的是哪一個虛拟機程序。 對于本地虛拟機程序來講,LVMID和作業系統的程序ID(Process Identifer ,PID) 一緻。

jps可以通過RMI協定檢視開啟了RMI服務的遠端虛拟機程序狀态。,hostid為RMI系統資料庫中注冊的主機名。

jps的其他常用選項

選項

-q

隻輸出LVMID,省略主類的名稱

-m

輸出虛拟機程序啟動時傳遞給主類main函數的參數

-l

輸出主類的全名,如果執行的是jar包,輸出jar路徑

-v

輸出虛拟機程序啟動時jvm參數

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

jstat (JVM Statistics Monitoring Tool)用于監視虛拟機各種運作狀态資訊的指令行工具。 它可以顯示本地或者遠端虛拟機程序中的類裝載、記憶體、垃圾會搜、JIT編譯等運作資料。

在沒有圖形化界面的伺服器上,它将是運作期定位虛拟機性能問題的首選工具

對于指令格式中的VMID和LVMID,如果是本地虛拟機程序,兩者一緻。如果是遠端虛拟機程序,則VMID的格式為

<code>[protocol:][//]lvmind[@hostname[:port]/servername]</code>

interval : 查詢間隔

count:查詢次數 如果省略interval和count,則隻查詢一次

假設需要250毫秒查詢一次程序3245的垃圾收集狀況,一共查詢20次

選項option代表使用者希望查詢的虛拟機資訊,主要分為3類:類裝載、垃圾收集、運作期編譯狀況。

jstat的主要選項

-class

監視類裝載、解除安裝數量,總空間以及類裝載鎖耗費的時間

-gc

監視Java堆狀況,包括eden區、兩個Survivor區、老年代、永久代等的容量、已使用空間、GC時間合計等資訊

-gccapacity

監視内容與-gc基本相同,但輸出主要關注Java堆各個區域使用的最大、最小空間

-gcutil

監視内容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比

-gccause

與-gcutil功能一樣,但是會額外輸出導緻上一次GC産生的原因

-gcnew

監視新生代GC狀況

-gcnewcapacity

監視内容與-gcnew 基本相同,但輸出主要關注Java堆各個區域使用的最大、最小空間

-gcold

監視老年代代GC狀況

-gcoldcapacity

監視内容與-gcold 基本相同,但輸出主要關注Java堆各個區域使用的最大、最小空間

-gcpermcapacity

輸出永久代使用的最大、最小空間

-compiler

輸出JIT編譯器編譯過的方法、耗時等資訊

-printcompilation

輸出已經被JIT編譯的方法

使用舉例

S0: Survivor0是空的

S1:Survivor1使用了91.47的空間

E:Eden 使用了 48.39%的空間

O: 老年代使用了 9.12%的空間

M: 因為我這裡是使用了JDK8 ,沒有了永久代的概念,這裡是中繼資料區

YGC: Minor GC表示程式啟動以來,發生了9次Minor GC

YGCT:Young GC Time 耗時為0.215秒

FGC:Full GC 表示程式啟動以來,發生了0次Minor GC

FGCT:Full GC Time 耗時為0秒

GCT:表示GC Time ,所有的GC總耗時 0.215秒

純文字狀态下監視虛拟機的變化确實不如後面提到的VisualVM等可視化的建施工局直接用圖形的方式展現直覺,但直接在主機上使用jstat指令仍然是一種常用的監控方式。

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】
JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

jmap的主要選項

-dump

生成java堆轉儲快照。 格式為 -dump:[live,] format=b,file=<code>&lt;filename&gt;</code> 其中live子參數說明是否隻dump出存活的對象

-finalizeinfo

顯示在F-Queue中等待Finalizer線程執行finalize方法的對象。 隻在linux/solaris平台有效

-heap

隻顯示Java堆詳細資訊。如使用腦脹回收器、參數配置、分代狀況等。隻在linux/solaris平台有效

-histo

顯示堆中對象統計資訊,包括類、執行個體數量、合計容量

-permstat

以ClassLoader為統計口徑顯示永久代記憶體狀态。 隻在linux/solaris平台有效

-F

當虛拟機程序對-dump選項沒有響應時,可以使用這個選項強制生成dump快照。隻在linux/solaris平台有效

使用舉例, 對pid=12888的程序輸出dump資訊

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

用法舉例

浏覽器輸入 http://localhost:7000/

JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】
JVM-10虛拟機性能監控與故障處理工具之【JDK的指令行】

jstack的主要選項

當正常輸出的請求不被響應時,強制輸出線程堆棧

如果調用到本地方法的話,可以顯示C/C++的堆棧

除了堆棧資訊,顯示關于鎖的附件資訊

Sun官方推薦的HotSpot虛拟機JIT編譯代碼的反彙編插件。了解即可。

繼續閱讀