深入理解Java虛擬機-如何利用 JDK 自帶的命令行工具監控上百萬的高併發的虛擬機性能...

點擊上方 好好學java ,選擇 星標 公衆號

重磅資訊、乾貨,第一時間送達
今日推薦:打卡活動第二期來啦,100% 能獲得獎品個人原創+1博客:點擊前往,查看更多

虛擬機系列文章

在前面的幾篇文章已經講解了利用一些可視化的工具進行 JVM 性能的監控,但是,在服務器上,我們很多時候是沒有辦法使用可視化的界面進行這種工作的,這種情景就相當於你需要遠程的 linux 系統一樣,我們沒有其他的辦法,只有一種辦法就是利用命令行進行操控,而當我們將我們的項目部署到遠程的服務器上的時候,我們是沒有辦法利用可視化的工具對 JVM 進行有效的監控的,這個時候 JDK 的自帶的工具就是發揮發的作用的時候了。

以下的這些命令如果放在可視化的工具都是可以被替代的,如果在開發或者測試的過程中,遇到需要監控 JVM 的情況,可以查看這篇文章進行閱讀如何利用可視化工具進行 JVM 調優深入理解Java虛擬機-如何利用VisualVM對高併發項目進行性能分析

接下來就對每一個常用的命令行工具做一番講解。

首先,先列出有哪些JDK命令行工具。

名稱解釋
jps顯示指定系統內所有的HotSpot虛擬機的進程
jstat用於收集HotSpot虛擬機各方面的運行數據
jinfo顯示虛擬機配置信息
jmap生成虛擬機的內存轉存儲快照(heapdump文件),利用這個文件就可以分析內存等情況
jhat用於分析上面jmap生成的heapdump文件,它會建立一個HTTP/HTML服務器,讓用戶可以在瀏覽器上查看分析結果
jstack顯示虛擬機的線程快照

1 jps:虛擬機進程狀況工具

這個工具使用的頻率還是非常高的,因爲你需要查看你的程序的運行情況的時候,首先需要知道的就是程序所運行的進程本地虛擬機唯一ID(LVMID),知道這個ID之後,纔可以進行其他監控的操作。

  • 命令格式:

1jps [選項] [主機id]
  • jps主要選項:

選項解釋
-q只輸出LVMID,省略主類名稱
-m輸出虛擬機進程啓動時傳遞給主類main()函數的參數
-l輸出主類的全名
-v輸出虛擬機進程啓動時的 JVM 參數
  • 實例

1jps -l
2jps -v

2 jinfo:Java配置信息工具

jinfo的功能很簡單,主要就是顯示和查看調整虛擬機的各種參數。

  • jinfo命令格式:

1jinfo [選項] pid
  • 相關選項

  • 實例

我們在啓動程序的時候設置一些JVM參數:-Xms512m -Xmx512m -Xmn128m -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15

我們先使用jps -l查看虛擬機進程ID;

再使用pid爲1584進行查詢參數;

3 jmap:Java內存映射工具

jmap的主要功能就是生成堆轉存儲快照,之後,我們再利用這個快照文件進行分析。

  • jmap命令格式:

1jmap [選項] vmid
  • 相關選項

選項解釋
-dump生成Java堆轉存儲快照,格式:-dump:[live,]format=b,file=<filename>,其中live子參數說明是否只dump出存活的對象
-finalizerinfo顯示在F-Queue中等待Finalizer線程執行finalize方法的對象,只在linux/Solaris有效
-heap顯示Java堆詳細信息,如使用哪種回收期、參數配置、分代狀況等等。只在Linux/Solaris有效
-histo顯示堆中對象統計信息,包括類、實例數量、合計容量
-permstat以ClassLoader爲統計口徑顯示永久代內存狀態,只在Linux/Solaris有效
-F當虛擬機進程對-dump選項沒有響應時,可使用這個選項強制生成dump快照,只在Linux/Solaris有效
  • 實例

首先還是查看虛擬機ID;

然後再運行下面命令行;

打開這個dump文件如下;

ok,現在已經有了生成的dump文件,所以,我們就需要對這個文件進行解析,看看jhat命令

4 jhat:虛擬機堆轉存儲快照分析工具

雖然好像這個命令挺牛逼,但是,其實,由於這個工具的功能不太夠,分析也得不到太多的結果,所以我們一般可以會將得到的dump文件用其他的工具進行分析,比如,可視化工具VisualVM等等。

所以,這裏簡單的做一個例子。

  • 實例

1jhat D:\dump.bin

如果有興趣查看如何利用VisualVM進行查看,可以查看這篇文章:深入理解Java虛擬機-如何利用VisualVM對高併發項目進行性能分析

5 jstack:Java堆棧跟蹤工具

jstack 命令主要用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的:定位線程出現長時間停頓的原因、請求外部資源導致的長時間等待等這些原因。

  • jstack命令格式:

1jstack [選項] vmid
  • 相關選項

選項解釋
-F當正常輸出的請求不被響應時,強制輸出線程堆棧
-l除堆棧外,顯示關於鎖的附加信息
-m如果調用到本地方法的話,可以顯示C/C++的堆棧
  • 實例

1jstack -l 6708

6 jstat:虛擬機統計信息監視工具

jstat這個工具還是很有作用的,他可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在服務器上,他是運行期定位虛擬機性能問題的首選工具。

  • jstat命令格式:

1jstat [選項 vmid [interval[s|ms] [count]]]
  • 相關選項

選項解釋
-class監視類裝載、卸載數量、總空間以及類裝載所耗費的時間
-gc監視Java堆狀況,包括Eden區、兩個Survivor區、老年代、永久代等容量、已用空間、GC時間合計等信息
-gccapacity監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間
-gcutil監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause與-gcutil功能一樣,但是會輸出額外導致上一次GC產生的原因
-gcnew監視新生代GC狀況
-gcnewcapacity監控內容與-gcnew一樣,輸出主要關注使用到的最大最小空間
-gcold監控老年代GC狀況
-gcoldcapacity監控內容與-gcold一樣,輸出主要關注使用到的最大最小空間
-gcpermcapacity輸出永久代使用到的最大最小空間
-compiler輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation輸出已經被JIT編譯過的方法
  • 實例

我們這裏還關注一下虛擬機GC的狀況。

1jstat -gcutil 9676

上面參數的含義:

S0:第一個Survivor區的空間使用(%)大小
S1:第二個Survivor區的空間使用(%)大小
E:Eden區的空間使用(%)大小
O:老年代空間使用(%)大小
M:方法區空間使用(%)大小
CCS:壓縮類空間使用(%)大小
YGC:年輕代垃圾回收次數
YGCT:年輕代垃圾回收消耗時間
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間

瞭解了這些參數的意義之後,我們就可以對虛擬機GC狀況進行分析。我們發現年輕代回收次數12次,使用時間1.672s,老年代回收0次,使用時間0s,所有GC總耗時1.672s。

通過以上參數分析,發現老年代Full GC沒有,說明沒有大對象進入到老年代,整個老年代的GC情況還是不錯的。另外,年輕代回收次數12次,使用時間1.672s,每次用時100ms左右,這個時間稍微長了一點,可以將新生代的空間調低一點,以降低每一次的GC時間。

7 總結

這篇文章主要就講解了虛擬機命令行工具的使用方法,學會這些命令行工具的使用,可以幫助我們更好的分析虛擬機的運行情況,也可以幫助我們分析問題。


更多Java技術文章,盡在【好好學java】網站。網址:www.java1000.com  搜索 好好學java 或 閱讀原文 可達!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章