第4章 虚拟机性能监控、故障处理工具(上)
Java與C++之間有一堵由內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)所圍成的高墻,墻外面的人想進(jìn)去,墻里面的人卻想出來。
4.1 概述
經(jīng)過前面兩章對于虛擬機(jī)內(nèi)存分配與回收技術(shù)各方面的介紹,相信讀者已經(jīng)建立了一個(gè)比較系統(tǒng)、完整的理論基礎(chǔ)。理論總是作為指導(dǎo)實(shí)踐的工具,把這些知識(shí)應(yīng)用到實(shí)際工作中才是我們的最終目的。
接下來的兩章,我們將從實(shí)踐的角度去認(rèn)識(shí)虛擬機(jī)內(nèi)存管理的世界。給一個(gè)系統(tǒng)定位問題的時(shí)候,知識(shí)、經(jīng)驗(yàn)是關(guān)鍵基礎(chǔ),數(shù)據(jù)是依據(jù),工具是運(yùn)用知識(shí)處理數(shù)據(jù)的手段。這里說的數(shù)據(jù)包括但不限于異常堆棧、虛擬機(jī)運(yùn)行日志、垃圾收集器日志、線程快照(threaddump/javacore文件)、堆轉(zhuǎn)儲(chǔ)快照(heapdump/hprof文件)等。恰當(dāng)?shù)厥褂锰摂M機(jī)故障處理、分析的工具可以提升我們分析數(shù)據(jù)、定位并解決問題的效率,但我們在學(xué)習(xí)工具前,也應(yīng)當(dāng)意識(shí)到工具永遠(yuǎn)都是知識(shí)技能的一層包裝,沒有什么工具是“秘密武器”,擁有了就能“包治百病”。
4.2 基礎(chǔ)故障處理工具
Java開發(fā)人員肯定都知道JDK的bin目錄中有java.exe、javac.exe這兩個(gè)命令行工具,但并非所有程序員都了解過JDK的bin目錄下其他各種小工具的作用。隨著JDK版本的更迭,這些小工具的數(shù)量和功能也在不知不覺地增加與增強(qiáng)。除了編譯和運(yùn)行Java程序外,打包、部署、簽名、調(diào)試、監(jiān)控、運(yùn)維等各種場景都可能會(huì)用到它們,這些工具如圖4-1所示。
在本章,筆者將介紹這些工具中的一部分,主要是用于監(jiān)視虛擬機(jī)運(yùn)行狀態(tài)和進(jìn)行故障處理的工具。這些故障處理工具并不單純是被Oracle公司作為“禮物”附贈(zèng)給JDK的使用者,根據(jù)軟件可用性和授權(quán)的不同,可以把它們劃分成三類:
- 商業(yè)授權(quán)工具:主要是JMC(Java Mission Control)及它要使用到的JFR(JavaFlight Recorder),JMC這個(gè)原本來自于JRockit的運(yùn)維監(jiān)控套件從JDK 7 Update40開始就被集成到OracleJDK中,JDK 11之前都無須獨(dú)立下載,但是在商業(yè)環(huán)境中使用它則是要付費(fèi)的。
- 正式支持工具:這一類工具屬于被長期支持的工具,不同平臺(tái)、不同版本的JDK之間,這類工具可能會(huì)略有差異,但是不會(huì)出現(xiàn)某一個(gè)工具突然消失的情況。
- 實(shí)驗(yàn)性工具:這一類工具在它們的使用說明中被聲明為“沒有技術(shù)支持,并且是實(shí)驗(yàn)性質(zhì)的”(Unsupported and Experimental)產(chǎn)品,日后可能會(huì)轉(zhuǎn)正,也可能會(huì)在某個(gè)JDK版本中無聲無息地消失。但事實(shí)上它們通常都非常穩(wěn)定而且功能強(qiáng)大,也能在處理應(yīng)用程序性能問題、定位故障時(shí)發(fā)揮很大的作用。
讀者如果比較細(xì)心的話,還可能會(huì)注意到這些工具程序大多數(shù)體積都異常小。假如之前沒注意到,現(xiàn)在不妨再看看圖4-1中的最后一列“大小”,各個(gè)工具的體積基本上都穩(wěn)定在21KB左右。并非JDK開發(fā)團(tuán)隊(duì)刻意把它們制作得如此精煉、統(tǒng)一,而是因?yàn)檫@些命令行工具大多僅是一層薄包裝而已,真正的功能代碼是實(shí)現(xiàn)在JDK的工具類庫中的,讀者把圖4-1和圖4-2兩張圖片對比一下就可以看得很清楚。假如讀者使用的是Linux版本的JDK,還可以發(fā)現(xiàn)這些工具中不少是由Shell腳本直接寫成,可以用文本編輯器打開并編輯修改它們。
JDK開發(fā)團(tuán)隊(duì)選擇采用Java語言本身來實(shí)現(xiàn)這些故障處理工具是有特別用意的:當(dāng)應(yīng)用程序部署到生產(chǎn)環(huán)境后,無論是人工物理接觸到服務(wù)器還是遠(yuǎn)程Telnet到服務(wù)器上都可能會(huì)受到限制。借助這些工具類庫里面的接口和實(shí)現(xiàn)代碼,開發(fā)者可以選擇直接在應(yīng)用程序中提供功能強(qiáng)大的監(jiān)控分析功能。
本章所講解的工具大多基于Windows平臺(tái)下的JDK進(jìn)行演示,如果讀者選用的JDK版本、操作系統(tǒng)不同,那么工具不僅可能數(shù)量上有所差別,同一個(gè)工具所支持的功能范圍和效果都可能會(huì)不一樣。本章提及的工具,如無特別說明,是JDK 5中就已經(jīng)存在的,但為了避免運(yùn)行環(huán)境帶來的差異和兼容性問題,建議讀者使用更高版本的JDK來驗(yàn)證本章介紹的內(nèi)容。通常高版本JDK的工具有可能向下兼容運(yùn)行于低版本JDK的虛擬機(jī)上的程序,反之則一般不行。
注意 如果讀者在工作中需要監(jiān)控運(yùn)行于JDK 5的虛擬機(jī)之上的程序,在程序啟動(dòng)時(shí)請?zhí)砑訁?shù)“-Dcom.sun.management.jmxremote”開啟JMX管理功能,否則由于大部分工具都是基于或者要用到JMX(包括下一節(jié)的可視化工具),它們都將無法使用,如果被監(jiān)控程序運(yùn)行于JDK 6或以上版本的虛擬機(jī)之上,那JMX管理默認(rèn)是開啟的,虛擬機(jī)啟動(dòng)時(shí)無須再添加任何參數(shù)。
4.2.1 jps:虛擬機(jī)進(jìn)程狀況工具
JDK的很多小工具的名字都參考了UNIX命令的命名方式,jps(JVM ProcessStatus Tool)是其中的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令類似:可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程,并顯示虛擬機(jī)執(zhí)行主類(Main Class,main()函數(shù)所在的類)名稱以及這些進(jìn)程的本地虛擬機(jī)唯一ID(LVMID,LocalVirtual Machine Identifier)。雖然功能比較單一,但它絕對是使用頻率最高的JDK命令行工具,因?yàn)槠渌腏DK工具大多需要輸入它查詢到的LVMID來確定要監(jiān)控的是哪一個(gè)虛擬機(jī)進(jìn)程。對于本地虛擬機(jī)進(jìn)程來說,LVMID與操作系統(tǒng)的進(jìn)程ID(PID,Process Identifier)是一致的,使用Windows的任務(wù)管理器或者UNIX的ps命令也可以查詢到虛擬機(jī)進(jìn)程的LVMID,但如果同時(shí)啟動(dòng)了多個(gè)虛擬機(jī)進(jìn)程,無法根據(jù)進(jìn)程名稱定位時(shí),那就必須依賴jps命令顯示主類的功能才能區(qū)分了。
jps命令格式:
jps [ options ] [ hostid ]jps執(zhí)行樣例:
jps -l 1168 jdk.jcmd/sun.tools.jps.Jpsjps還可以通過RMI協(xié)議查詢開啟了RMI服務(wù)的遠(yuǎn)程虛擬機(jī)進(jìn)程狀態(tài),參數(shù)hostid為RMI注冊表中注冊的主機(jī)名。jps的其他常用選項(xiàng)見表4-1。
4.2.2 jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
jstat(JVM Statistics Monitoring Tool)是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具。它可以顯示本地或者遠(yuǎn)程虛擬機(jī)進(jìn)程中的類加載、內(nèi)存、垃圾收集、即時(shí)編譯等運(yùn)行時(shí)數(shù)據(jù),在沒有GUI圖形界面、只提供了純文本控制臺(tái)環(huán)境的服務(wù)器上,它將是運(yùn)行期定位虛擬機(jī)性能問題的常用工具。
jstat命令格式為:
jstat -<option> <vmid> [<interval> [<count>]]對于命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機(jī)進(jìn)程,VMID與LVMID是一致的;如果是遠(yuǎn)程虛擬機(jī)進(jìn)程,那VMID的格式應(yīng)當(dāng)是:
[protocol:][//]lvmid[@hostname[:port].servername]參數(shù)interval和count代表查詢間隔和次數(shù),如果省略這2個(gè)參數(shù),說明只查詢一次。假設(shè)需要每250毫秒查詢一次進(jìn)程2764垃圾收集狀況,一共查詢20次,那命令應(yīng)當(dāng)是:
jstat -gc 2764 250 20選項(xiàng)option代表用戶希望查詢的虛擬機(jī)信息,主要分為三類:類加載、垃圾收集、運(yùn)行期編譯狀況。詳細(xì)請參考表4-2中的描述。
jstat監(jiān)視選項(xiàng)眾多,囿于版面原因無法逐一演示,這里僅舉一個(gè)在命令行下監(jiān)視一臺(tái)服務(wù)器的內(nèi)存狀況的例子,用以演示如何查看監(jiān)視結(jié)果。監(jiān)視參數(shù)與輸出結(jié)果如代碼清單4-1所示。
查詢結(jié)果表明:這臺(tái)服務(wù)器的新生代Eden區(qū)(E,表示Eden)使用了52%的空間,2個(gè)Survivor區(qū)(S0、S1,表示Survivor0、Survivor1)中S0使用了0.08%的空間,S1里面是空的,老年代(O,表示Old)和元空間(M,表示Metaspace)則分別使用了38.41%和94.74%的空間。程序運(yùn)行以來共發(fā)生Minor GC(YGC,表示Young GC)7466次,總耗時(shí)12.813秒;發(fā)生Full GC(FGC,表示Full GC)872次,總耗時(shí)(FGCT,表示Full GC Time)為148.919秒;所有GC總耗時(shí)(GCT,表示GC Time)為161.732秒。
使用jstat工具在純文本狀態(tài)下監(jiān)視虛擬機(jī)狀態(tài)的變化,在用戶體驗(yàn)上也許不如后文將會(huì)提到的JMC、VisualVM等可視化的監(jiān)視工具直接以圖表展現(xiàn)那樣直觀,但在實(shí)際生產(chǎn)環(huán)境中不一定可以使用圖形界面,而且多數(shù)服務(wù)器管理員也都已經(jīng)習(xí)慣了在文本控制臺(tái)工作,直接在控制臺(tái)中使用jstat命令依然是一種常用的監(jiān)控方式。
4.2.3 jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)。使用jps命令的-v參數(shù)可以查看虛擬機(jī)啟動(dòng)時(shí)顯式指定的參數(shù)列表,但如果想知道未被顯式指定的參數(shù)的系統(tǒng)默認(rèn)值,除了去找資料外,就只能使用jinfo的-flag選項(xiàng)進(jìn)行查詢了(如果只限于JDK 6或以上版本的話,使用java-XX:+PrintFlagsFinal查看參數(shù)默認(rèn)值也是一個(gè)很好的選擇)。jinfo還可以使用-sysprops選項(xiàng)把虛擬機(jī)進(jìn)程的System.getProperties()的內(nèi)容打印出來。這個(gè)命令在JDK 5時(shí)期已經(jīng)隨著Linux版的JDK發(fā)布,當(dāng)時(shí)只提供了信息查詢的功能,JDK 6之后,jinfo在Windows和Linux平臺(tái)都有提供,并且加入了在運(yùn)行期修改部分參數(shù)值的能力(可以使用-flag[+|-]name或者-flag name=value在運(yùn)行期修改一部分運(yùn)行期可寫的虛擬機(jī)參數(shù)值)。在JDK 6中,jinfo對于Windows平臺(tái)功能仍然有較大限制,只提供了最基本的-flag選項(xiàng)。
jinfo命令格式:
jinfo <option> <pid>執(zhí)行樣例:查詢CMSInitiatingOccupancyFraction參數(shù)值
jinfo -flag CMSInitiatingOccupancyFraction 6352 -XX:CMSInitiatingOccupancyFraction=-14.2.4 jmap:Java內(nèi)存映像工具
jmap(Memory Map for Java)命令用于生成堆轉(zhuǎn)儲(chǔ)快照(一般稱為 heapdump 或 dump 文件)。如果不使用 jmap 命令,要想獲取Java堆轉(zhuǎn)儲(chǔ)快照也還有一些比較“暴力”的手段:譬如在第2章中用過的 -XX:+HeapDumpOnOutOfMemoryError 參數(shù),可以讓虛擬機(jī)在內(nèi)存溢出異常出現(xiàn)之后自動(dòng)生成堆轉(zhuǎn)儲(chǔ)快照文件,通過 -XX:+HeapDumpOnCtrlBreak 參數(shù)則可以使用 [Ctrl] + [Break] 鍵讓虛擬機(jī)生成堆轉(zhuǎn)儲(chǔ)快照文件,又或者在 Linux 系統(tǒng)下通過 Kill -3 命令發(fā)送進(jìn)程退出信號(hào)“恐嚇”一下虛擬機(jī),也能順利拿到堆轉(zhuǎn)儲(chǔ)快照。
jmap的作用并不僅僅是為了獲取堆轉(zhuǎn)儲(chǔ)快照,它還可以查詢 finalize 執(zhí)行隊(duì)列、Java堆和方法區(qū)的詳細(xì)信息,如空間使用率、當(dāng)前用的是哪種收集器等。
和jinfo命令一樣,jmap有部分功能在Windows平臺(tái)下是受限的,除了生成堆轉(zhuǎn)儲(chǔ)快照的-dump選項(xiàng)和用于查看每個(gè)類的實(shí)例、空間占用統(tǒng)計(jì)的-histo選項(xiàng)在所有操作系統(tǒng)中都可以使用之外,其余選項(xiàng)都只能在Linux/Solaris中使用。
jmap命令格式:
jmap -<option> <pid>option選項(xiàng)的合法值與具體含義如表4-3所示。
代碼清單4-2是使用jmap生成一個(gè)正在運(yùn)行的進(jìn)程的堆轉(zhuǎn)儲(chǔ)快照文件的例子,例子中的6352是通過jps命令查詢到的LVMID。代碼清單4-2 使用jmap生成dump文件
jmap -dump:format=b,file=test.dump 6352 Heap dump file created4.2.5 jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具
JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉(zhuǎn)儲(chǔ)快照。jhat內(nèi)置了一個(gè)微型的HTTP/Web服務(wù)器,生成堆轉(zhuǎn)儲(chǔ)快照的分析結(jié)果后,可以在瀏覽器中查看。不過實(shí)事求是地說,在實(shí)際工作中,除非手上真的沒有別的工具可用,否則多數(shù)人是不會(huì)直接使用jhat命令來分析堆轉(zhuǎn)儲(chǔ)快照文件的,主要原因有兩個(gè)方面。一是一般不會(huì)在部署應(yīng)用程序的服務(wù)器上直接分析堆轉(zhuǎn)儲(chǔ)快照,即使可以這樣做,也會(huì)盡量將堆轉(zhuǎn)儲(chǔ)快照文件復(fù)制到其他機(jī)器上進(jìn)行分析,因?yàn)榉治龉ぷ魇且粋€(gè)耗時(shí)而且極為耗費(fèi)硬件資源的過程,既然都要在其他機(jī)器上進(jìn)行,就沒有必要再受命令行工具的限制了。另外一個(gè)原因是jhat的分析功能相對來說比較簡陋,后文將會(huì)介紹到的VisualVM,以及專業(yè)用于分析堆轉(zhuǎn)儲(chǔ)快照文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能實(shí)現(xiàn)比jhat更強(qiáng)大專業(yè)的分析功能。代碼清單4-3演示了使用jhat分析上一節(jié)采用jmap生成的內(nèi)存快照文件。
jhat test.dump Reading from test.dump... Dump file created Wed Jul 20 17:55:02 CST 2022 Snapshot read, resolving... Resolving 865730 objects... Chasing references, expect 173 dots..................................................................................... ........................................................................................ Eliminating duplicate references........................................................................................ ..................................................................................... Snapshot resolved. Started HTTP server on port 7000 Server is ready.屏幕顯示“Server is ready.”的提示后,用戶在瀏覽器中輸入http://localhost:7000/可以看到分析結(jié)果
分析結(jié)果默認(rèn)以包為單位進(jìn)行分組顯示,分析內(nèi)存泄漏問題主要會(huì)使用到其中的“Heap Histogram”(與jmap-histo功能一樣)與OQL頁簽的功能,前者可以找到內(nèi)存中總?cè)萘孔畲蟮膶ο?#xff0c;后者是標(biāo)準(zhǔn)的對象查詢語言,使用類似SQL的語法對內(nèi)存中的對象進(jìn)行查詢統(tǒng)計(jì)。
4.2.6 jstack:Java堆棧跟蹤工具
jstack(Stack Trace for Java)命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照(一般稱為threaddump或者javacore文件)。線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的目的通常是定位線程出現(xiàn)長時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導(dǎo)致的長時(shí)間掛起等,都是導(dǎo)致線程長時(shí)間停頓的常見原因。線程出現(xiàn)停頓時(shí)通過jstack來查看各個(gè)線程的調(diào)用堆棧,就可以獲知沒有響應(yīng)的線程到底在后臺(tái)做些什么事情,或者等待著什么資源。
jstack命令格式:
jstack [-l][-e] <pid>選項(xiàng)的合法值與具體含義如表4-4所示。
代碼清單4-4 使用jstack查看線程堆棧(部分結(jié)果)
從JDK 5起,java.lang.Thread類新增了一個(gè)getAllStackTraces()方法用于獲取虛擬機(jī)中所有線程的StackTraceElement對象。
4.2.7 基礎(chǔ)工具總結(jié)
下面表4-5~表4-14中羅列了JDK附帶的全部(包括曾經(jīng)存在但已經(jīng)在最新版本中被移除的)工具及其簡要用途,限于篇幅,本節(jié)只講解了6個(gè)常用的命令行工具。筆者選擇這幾個(gè)工具除了因?yàn)樗鼈兪亲罨A(chǔ)的命令外,還因?yàn)樗鼈円呀?jīng)有很長的歷史,能適用于大多數(shù)讀者工作、學(xué)習(xí)中使用的JDK版本。在高版本的JDK中,這些工具大多已有了功能更為強(qiáng)大的替代品,譬如JCMD、JHSDB的命令行模式,但使用方法也是相似的,無論JDK發(fā)展到了什么版本,學(xué)習(xí)這些基礎(chǔ)的工具命令并不會(huì)過時(shí)和浪費(fèi)。
- 基礎(chǔ)工具:用于支持基本的程序創(chuàng)建和運(yùn)行
| appletviewer | 在不使用Web瀏覽器的情況下運(yùn)行和調(diào)試Applet,JDK11中被移除 |
| extcheck | 檢查JAR沖突的工具,從JDK9中被移除 |
| jar | 創(chuàng)建和管理JAR文件 |
| java | Java運(yùn)行工具,用于運(yùn)行Class文件或JAR文件 |
| javac | 用于Java編程語言的編譯器 |
| javadoc | Java的API文檔生成器 |
| javah | C語言頭文件和Stub函數(shù)生成器,用于編寫JNI方法 |
| javap | Java字節(jié)碼分析工具 |
| jlink | 將Module和它的依賴打包成一個(gè)運(yùn)行時(shí)鏡像文件 |
| jdb | 基于JPDA協(xié)議的調(diào)試器,以類似于GDB的方式進(jìn)行調(diào)試Java代碼 |
| jdeps | Java類依賴性分析器 |
| jdeprscan | 用于搜索JAR包中使用了“deprecated”的類,從JDK9開始提供 |
- 安全:用于程序簽名、設(shè)置安全測試等
| keytool | 管理密鑰庫和證書。主要用于獲取或緩存Kerberos協(xié)議的票據(jù)授權(quán)票據(jù)。允許用戶查看本地憑據(jù)和密鑰表中的條目(用于Kerberos協(xié)議) |
| jarsigner | 生成并驗(yàn)證JAR簽名 |
| policytool | 管理策略文件的GUI工具,用于管理用戶策略文件(.java.policy),在JDK10中被移除 |
- 國際化:用于創(chuàng)建本地語言文件
| native2ascii | 本地編碼到ASCII編碼的轉(zhuǎn)換器,用于“任意受支持的字符編碼”和與之對應(yīng)的“ASCII編碼和Unicode轉(zhuǎn)義”之間的相互轉(zhuǎn)換 |
- 遠(yuǎn)程方法調(diào)用:用于跨Web或網(wǎng)絡(luò)的服務(wù)交互
| rmic | Java RMI 編譯器,為使用 JRMP 或 IIPO 協(xié)議的遠(yuǎn)程對象生成Stub、Skeleton 和 Tie 類,也用于生成 OMG IDL |
| rmiregistry | 遠(yuǎn)程對象注冊表服務(wù),用于在當(dāng)前主機(jī)的指定端口上創(chuàng)建并啟動(dòng)一個(gè)遠(yuǎn)程對象注冊表 |
| rmid | 啟動(dòng)激活系統(tǒng)守護(hù)進(jìn)程,允許在虛擬機(jī)中注冊激活對象 |
| serialver | 生成并返回指定類的序列化版本ID |
- Java IDL與RMI-IIOP:在JDK 11中結(jié)束了十余年的CORBA支持,這些工具不再提供
| tnameserv | 提供對命名服務(wù)的訪問 |
| idlj | IDL 轉(zhuǎn) Java 編譯器,生成映射 OMG IDL 接口的Java源文件,并啟用以Java語言編寫的使用CORBA功能的應(yīng)用程序的Java源文件。IDL 即接口定義語言 |
| orbd | 對象請求代理守護(hù)進(jìn)程(Object Request Broker Daemon),提供從客戶端查找和調(diào)用CORBA環(huán)境服務(wù)端上的持久化對象的功能。 |
| servertool | 為應(yīng)用程序注冊、注銷、啟動(dòng)和關(guān)閉服務(wù)提供易用的接口 |
- 部署工具:用于程序打包、發(fā)布和部署
| Javapackager | 打包、簽名Java和Java FX 應(yīng)用程序,在JDK11中被移除 |
| pack200 | 使用Java GZIP 壓縮器將JAR文件轉(zhuǎn)換為壓縮的Pack200文件。壓縮的壓縮文件是高度壓縮的JAR,可以直接部署,節(jié)省帶寬并減少下載時(shí)間 |
| unpack200 | 將Pack200 生成的打包文件壓縮提取為JAR 文件 |
- Java Web Start
| javaws | 啟動(dòng)Java Web Start并設(shè)置各種選項(xiàng)的工具。在JDK 11中被移除 |
- 性能監(jiān)控和故障處理:用于監(jiān)控分析Java虛擬機(jī)運(yùn)行信息,排查問題
| jps | JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot 虛擬機(jī)進(jìn)程 |
| jstat | JVM Statistics Monitoring Tool ,用于收集HotSpot 虛擬機(jī)各方面的運(yùn)行數(shù)據(jù) |
| jstatd | JVM Statistics Monitoring Tool Daemon ,jstat的守護(hù)程序,啟動(dòng)一個(gè)RMI服務(wù)器應(yīng)用程序,用于監(jiān)視測試的HotSpot虛擬機(jī)的創(chuàng)建和終止,并提供一個(gè)界面,允許遠(yuǎn)程監(jiān)控工具附加到在本地系統(tǒng)上運(yùn)行的虛擬機(jī)。在JDK9中集成到了JHSDB中 |
| jinfo | Configuration Info for Java,顯示虛擬機(jī)配置信息。在JDK9中集成到了JHSDB中 |
| jmap | Memory Map for Java,生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲(chǔ)快照(headdump文件)。在JDK9中集成到了JHSDB中 |
| jhat | JVM Heap Analysis Tool,用于分析堆轉(zhuǎn)儲(chǔ)快照,它會(huì)建立一個(gè)HTTP/Web服務(wù)器,讓用戶可以在瀏覽器上查看分析結(jié)果。在JDK9中集成到了JHSDB中 |
| jhsdb | Java HotSpot Debugger,一個(gè)基于Serviceability Agent 的HotSpot 進(jìn)程調(diào)試器,從JDK9 開始提供 |
| jsadebugd | Java Serviceability Agent Debug Daemon,用于Java的可維護(hù)性代理調(diào)試守護(hù)程序,主要用于附加到指定的Java進(jìn)程、核心文件,或充當(dāng)一個(gè)調(diào)試服務(wù)器 |
| jcmd | JVM Command,虛擬機(jī)診斷命令工具,將診斷命令請求發(fā)送到正在運(yùn)行的Java虛擬機(jī)。 |
| jconsole | Java Console ,用于監(jiān)控Java虛擬機(jī)的使用JMX規(guī)范的圖形工具。它可以監(jiān)控本地和遠(yuǎn)程Java虛擬機(jī),還可以監(jiān)控和管理應(yīng)用程序。 |
| jmc | Java Mission Control , 包含用于監(jiān)控和管理Java應(yīng)用程序的工具,而不會(huì)引入與這些工具相關(guān)聯(lián)的性能開銷。開發(fā)者可以使用jmc命令來創(chuàng)建JMC工具 |
| jvisualvm | Java VisualVM,一種圖形化工具,可在Java虛擬機(jī)中運(yùn)行時(shí)提供有關(guān)基于Java技術(shù)的應(yīng)用程序的詳細(xì)信息。提供內(nèi)存和CPU分析、堆轉(zhuǎn)儲(chǔ)分析、內(nèi)存泄漏檢測、MBean訪問和垃圾收集。 |
- WebService工具:與CORBA一起在JDK 11中被移除
| schemagen | 用于 XML 綁定的Schema 生成器,用于生成 XML Schema文件 |
| wsgen | XML Web Service 2.0 的Java API,生成用于JAX-WS Web Service 的JAX-WS便攜式產(chǎn)物 |
| wsimport | XML Web Service 2.0 的Java API,生成用于根據(jù)服務(wù)端發(fā)布的WSDL文件生成客戶端 |
| xjc | 主要用于根據(jù)XML Schema 文件生成對應(yīng)的Java類 |
- REPL和腳本工具
| jshell | 基于Java的 Shell REPL(Read-Eval-Print Loop)交互工具 |
| jjs | 對Nashorn 引擎的調(diào)用入口。Nashorn是基于Java實(shí)現(xiàn)的一個(gè)輕量級高性能JavaScript運(yùn)行環(huán)境 |
| jrunscript | Java命令行腳本外殼工具(Conmmand Line Script Shell),主要用于解釋執(zhí)行javas、Groovy、Ruby等腳本語言 |
總結(jié)
以上是生活随笔為你收集整理的第4章 虚拟机性能监控、故障处理工具(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python小白学习第二天
- 下一篇: 视觉技术再赋能,深眸科技一体化解决方案引