Jstat使用簡介

一、 實踐用例:

性能測試過程中,我們該如何監控java虛擬機內存的使用情況,用以判斷JVM是否存在內存問題呢?如何判斷JVM垃圾回收是否正常?一般的top指令基本上滿足不了這樣的需求,因爲它主要監控的是總體的系統資源,很難定位到java應用程序。
在項目實踐過程中,我們探索和使用了一款新工具--Jstat。
    先秀一下。Jstat是JDK自帶的一個輕量級小工具。全稱“Java Virtual Machine statistics monitoring tool”,它位於java的bin目錄下,主要利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常適用。
那,該怎麼用呢?
    語法結構如下:jstat [Options] vmid [interval] [count]
    Options — 選項,我們一般使用 -gcutil 查看gc情況
    vmid    — VM的進程號,即當前運行的java進程號
    interval– 間隔時間,單位爲秒或者毫秒
    count   — 打印次數,如果缺省則打印無數次
    下面給出一個實際的例子:





 

注:由於JVM內存設置較大,圖中百分比變化不太明顯

 
    圖中參數含義如下:
    S0  — Heap上的 Survivor space 0 區已使用空間的百分比
    S1  — Heap上的 Survivor space 1 區已使用空間的百分比
    E   — Heap上的 Eden space 區已使用空間的百分比
    O   — Heap上的 Old space 區已使用空間的百分比
    P   — Perm space 區已使用空間的百分比
    YGC — 從應用程序啓動到採樣時發生 Young GC 的次數
    YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)
    FGC — 從應用程序啓動到採樣時發生 Full GC 的次數
    FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)
    GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒) 
    上圖的示例,紅框中,我們可以看到,5次young gc之後,垃圾內存被從Eden space區(E)放入了Old space區(O),並引起了百分比的變化,導致Survivor space使用的百分比從19.69%(S0)降到10.34%(S1)。有效釋放了內存空間。綠框中,我們可以看到,一次full gc之後,Old space區(O)的內存被回收,從36.81%降到35.01%。
    圖中同時打印了young gc和full gc的總次數、總耗時。而,每次young gc消耗的時間,可以用相間隔的兩行YGCT相減得到。每次full gc消耗的時間,可以用相隔的兩行FGCT相減得到。例如紅框中表示的第一行、第二行之間發生了1次young gc,消耗的時間爲52.281-52.252=0.029秒。
    常駐內存區(P)的使用率,始終停留在37.6%左右,說明常駐內存沒有突變,比較正常。
如果young gc和full gc能夠正常發生,而且都能有效回收內存,常駐內存區變化不明顯,則說明java內存釋放情況正常,垃圾回收及時,java內存泄露的機率就會大大降低。但也不能說明一定沒有內存泄露。
    以上,介紹了Jstat按百分比查看gc情況的功能。其實,它還有其它功能,例如加載類信息統計功能、內存池信息統計功能等,那些是以絕對值的形式打印出來的,比較少用,在此就不做介紹。

二、 使用介紹: 
    jstat :對VM內存使用量進行監控。
    jstat工具特別強大,有衆多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。
    jstat -class pid:顯示加載class的數量,及所佔空間等信息。
    jstat -compiler pid:顯示VM實時編譯的數量等信息。
    jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
    jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。其他的可以根據這個類推, OC是old內純的佔用量。
    jstat -gcnew pid:new對象的信息。
    jstat -gcnewcapacity pid:new對象的信息及其佔用量。
    jstat -gcold pid:old對象的信息。
    jstat -gcoldcapacity pid:old對象的信息及其佔用量。
    jstat -gcpermcapacity pid: perm對象的信息及其佔用量。
    jstat -util pid:統計gc信息統計。
    jstat -printcompilation pid:當前VM執行的信息。
    除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,還可以加上-h3每三行顯示一下標題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章