點擊上方 好好學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.672
s,老年代回收0
次,使用時間0
s,所有GC總耗時1.672
s。
通過以上參數分析,發現老年代Full GC沒有,說明沒有大對象進入到老年代,整個老年代的GC情況還是不錯的。另外,年輕代回收次數12
次,使用時間1.672
s,每次用時100ms左右,這個時間稍微長了一點,可以將新生代的空間調低一點,以降低每一次的GC時間。
7 總結
這篇文章主要就講解了虛擬機命令行工具的使用方法,學會這些命令行工具的使用,可以幫助我們更好的分析虛擬機的運行情況,也可以幫助我們分析問題。
更多Java技術文章,盡在【好好學java】網站。網址:www.java1000.com 搜索 好好學java 或 閱讀原文 可達!