28-虛擬機性能監(jiān)控&故障處理工具

歡迎關注公眾號OpenCoder,來和我做朋友吧~??????
經(jīng)過前面對于虛擬機內(nèi)存分配與回收技術各方面的介紹, 相信大家已經(jīng)建立了一個比較系統(tǒng)、 完整的理論基礎。理論總是作為指導實踐的工具, 把這些知識應用到實際工作中才是我們的最終目的。接下來的內(nèi)容, 我們將從實踐的角度去認識虛擬機內(nèi)存管理的世界。

給一個系統(tǒng)定位問題的時候, 知識、 經(jīng)驗是關鍵基礎, 數(shù)據(jù)是依據(jù), 工具是運用知識處理數(shù)據(jù)的手段。這里說的數(shù)據(jù)包括但不限于異常堆棧、 虛擬機運行日志、 垃圾收集器日志、 線程快照(threaddump/javacore文件) 、 堆轉(zhuǎn)儲快照(heapdump/hprof文件) 等。恰當?shù)厥褂锰摂M機故障處理、分析的工具可以提升我們分析數(shù)據(jù)、 定位并解決問題的效率, 但我們在學習工具前, 也應當意識到工具永遠都是知識技能的一層包裝, 沒有什么工具是“秘密武器”, 擁有了就能“包治百病”。

jps:虛擬機進程狀況工具

jps全稱:JVM Process Status Tool ,可以列出正在運行的虛擬機進程, 并顯示虛擬機執(zhí)行主類( Main Class, main()函數(shù)所在的類)名稱以及這些進程的本地虛擬機唯一ID( LVMID, Local Virtual Machine Identifier)

雖然功能比較單一, 但它絕對是使用頻率最高的JDK命令行工具, 因為其他的JDK工具大多需要輸入它查詢到的LVMID來確定要監(jiān)控的是哪一個虛擬機進程。對于本地虛擬機進程來說, LVMID與操作系統(tǒng)的進程ID( PID, Process Identifier) 是一致的, 使用Windows的任務管理器或者UNIX的ps命令也可以查詢到虛擬機進程的LVMID, 但如果同時啟動了多個虛擬機進程, 無法根據(jù)進程名稱定位時, 那就必須依賴jps命令顯示主類的功能才能區(qū)分了。

JPS命令格式:

jps [option] [hostid]

option參數(shù)有如下:

image

我們常用的就是 -l 快速顯示出我們想要查看的系統(tǒng)運行進程所在的id,后續(xù)配合我們的jstat工具使用

比如我們有如下代碼:

package demo6;

public class JPSDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(30000);
        System.out.println("hello jps");
    }
}

當我運行起來后,就可以通過IDEA 下方的Terminal工具輸入jps命令進行查看:

image

我們可以看到我們當前代碼所在的進程ID就是15020

jstat:虛擬機統(tǒng)計信息監(jiān)視工具

jstat( JVM Statistics Monitoring Tool) 是用于監(jiān)視虛擬機各種運行狀態(tài)信息的命令行工具。它可以顯示本地或者遠程虛擬機進程中的類加載、 內(nèi)存、 垃圾收集、 即時編譯等運行時數(shù)據(jù), 在沒有GUI圖形界面、 只提供了純文本控制臺環(huán)境的服務器上, 它將是運行期定位虛擬機性能問題的常用工具。

jstat命令格式為:

jstat [ option vmid [interval[s|ms] [count]] ]

對于命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機進程, VMID與LVMID是一致的;如果是遠程虛擬機進程, 那VMID的格式應當是:[protocol:][//]lvmid[@hostname[:port]/servername] 參數(shù)interval和count代表查詢間隔和次數(shù), 如果省略這2個參數(shù), 說明只查詢一次。假設需要每250毫秒查詢一次進程2764垃圾收集狀況, 一共查詢20次, 那命令應當是:jstat -gc 2764 250 20 選項option代表用戶希望查詢的虛擬機信息, 主要分為三類:類加載、 垃圾收集、 運行期編譯狀況。

image

這里知道了jstat的一些參數(shù)選項以及作用后,我們就可以結(jié)合jps命令先查詢到我們當前系統(tǒng)運行的進程ID,然后結(jié)合jstat命令來查看當前系統(tǒng)的內(nèi)存情況,如下:

image

查詢結(jié)果表明:這臺服務器的新生代Eden區(qū)(E, 表示Eden) 使用了24.34%的空間, 2個Survivor區(qū)(S0、 S1, 表示Survivor0、 Survivor1) 里面都是空的, 老年代(O, 表示Old) 和 元空間 (M,表示Metaspace) 則分別使用了0%和17.34%的空間。

程序運行以來共發(fā)生Minor GC(YGC, 表示Young GC) 0次, 總耗時0.000秒;發(fā)生Full GC(FGC, 表示Full GC) 0次, 總耗時(FGCT, 表示Full GC Time) 為0 秒;所有GC總耗時(GCT, 表示GC Time) 為0秒。

當然我們的代碼里面并沒有導致GC的發(fā)生,不過jstat工具卻是能非常清晰的幫助我們看到內(nèi)存的占用情況以及所用的時間和發(fā)生的次數(shù)

我們再來看常用的gc選項得到的結(jié)果:

image

跟我們的 選項 gcutil有些區(qū)別,這里做一下解釋:

  • S0C:這是s0區(qū)的大小,上圖代表我們的s0區(qū)是5M大小
  • S1C:這是s1區(qū)的大小,上圖代表我們的s1區(qū)是5M大小,跟S0是匹配的
  • S0U/S1U:代表的是兩個Survivor區(qū)當前使用的內(nèi)存大小,目前都是0未有對象占用
  • EC:Eden區(qū)的大小,32.5M
  • EU:Eden區(qū)當前使用的內(nèi)存大小,差不多8M
  • OC:老年代大小,差不多85.5M
  • OU:老年代當前使用的內(nèi)存大小,0代表沒有對象占用
  • MC:這是方法區(qū)(永久代、元數(shù)據(jù)區(qū))的大小
  • MU:這是方法區(qū)(永久代、元數(shù)據(jù)區(qū))當前使用的內(nèi)存大小

jmap和jhat:

jmap( Memory Map for Java) 命令用于生成堆轉(zhuǎn)儲快照( 一般稱為heapdump或dump文件)

jmap的作用并不僅僅是為了獲取堆轉(zhuǎn)儲快照, 它還可以查詢finalize執(zhí)行隊列、 Java堆和方法區(qū)的詳細信息, 如空間使用率、 當前用的是哪種收集器等

jmap命令格式:

jmap [ option ] vmid

option選項的合法值與具體含義如下所示 :

image

這里使用較多的主要就是兩個Option:

  1. -histo :如果只是想簡單了解下當前jvm中的對象對內(nèi)存占用的情況,直接使用jmap -histo命令即可
image

-dump

通過命令:jmap -dump:live,format=b,file=dump.hprof PID 會在當前目錄下生成一個 dump.hrpof 文件,一個二進制格式不能直接打卡,需要借助jhat工具

image

JDK提供 jhat( JVM Heap Analysis Tool) 命令與jmap搭配使用, 來分析jmap生成的堆轉(zhuǎn)儲快照。

jhat內(nèi)置了一個微型的HTTP/Web服務器, 生成堆轉(zhuǎn)儲快照的分析結(jié)果后, 可以在瀏覽器中查看。不過實事求是地說, 在實際工作中, 除非手上真的沒有別的工具可用, 否則多數(shù)人是不會直接使用jhat命令來分析堆轉(zhuǎn)儲快照文件的, 主要原因有兩個方面。

一是一般不會在部署應用程序的服務器上直接分析堆轉(zhuǎn)儲快照, 即使可以這樣做, 也會盡量將堆轉(zhuǎn)儲快照文件復制到其他機器上進行分析, 因為分析工作是一個耗時而且極為耗費硬件資源的過程, 既然都要在其他機器上進行, 就沒有必要再受命令行工具的限制了。

另外一個原因是jhat的分析功能相對來說比較簡陋, 后文將會介紹到的VisualVM, 以及專業(yè)用于分析堆轉(zhuǎn)儲快照文件的Eclipse Memory Analyzer、 IBM HeapAnalyzer等工具, 都能實現(xiàn)比jhat更強大專業(yè)的分析功能。

但是對于一些小公司而言,壓力不大的情況下,我們平時可以直接通過jstat jmap jhat 等工具去看看線上系統(tǒng)的JVM運行是否正常,有沒有頻繁Full GC的問題。如果有就優(yōu)化,沒有的話,平時每天定時去看看,或者每周都去看看即可。

通過命令解析dump快照:

image

通過瀏覽器打開查看:

image

小結(jié):

本篇通過介紹JPS、Jstat、Jmap、Jhat工具的使用,如何來進行JVM內(nèi)存的分析,大家可以自己結(jié)合一個程序進行練習掌握工具的基本使用。后續(xù)我們將通過兩個實戰(zhàn)案例結(jié)合工具來演示如何分析調(diào)優(yōu),幫助大家進一步掌握實操能力。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容