《深入理解JAVA虚拟机》周志明 第三版 - 第四章 虚拟机性能监控、故障处理工具
4.1 概述
恰當(dāng)?shù)厥褂锰摂M機(jī)故障處理、分析的工具可以提升我們分析數(shù)據(jù)、定位并解決問(wèn)題的效率。
4.2 基礎(chǔ)故障處理工具
JDK的bin目錄中有java.exe、javac.exe這兩個(gè)命令行工具,還有各種小工具,除了編譯和運(yùn)行Java程序外,打包、部署、簽名、調(diào)試、監(jiān)控、運(yùn)維等各種場(chǎng)景都可能會(huì)用到它們。
4.2.1 jps:虛擬機(jī)進(jìn)程狀況工具
可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程,并顯示虛擬機(jī)執(zhí)行主類(Main Class,main()函數(shù)所在的類)名稱以及這些進(jìn)程的本地虛擬機(jī)唯一ID,功能比較單一,但它絕對(duì)是使用頻率最高的JDK命令行工具。
jps還可以通過(guò)RMI協(xié)議查詢開(kāi)啟了RMI服務(wù)的遠(yuǎn)程虛擬機(jī)進(jìn)程狀態(tài),參數(shù)hostid為RMI注冊(cè)表中
注冊(cè)的主機(jī)名。
4.2.2 jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具。它可以顯示本地或者遠(yuǎn)程[1]虛擬機(jī)進(jìn)程中的類加載、內(nèi)存、垃圾收集、即時(shí)編譯等運(yùn)行時(shí)數(shù)據(jù),在沒(méi)有GUI圖形界面、只提供了純文本控制臺(tái)環(huán)境的服務(wù)器上,它將是運(yùn)行期定位虛擬機(jī)性能問(wèn)題的常用工具。
4.2.3 jinfo:Java配置信息工具
是實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)。使用jps命令的-v參數(shù)可以查看虛擬機(jī)啟動(dòng)時(shí)顯式指定的參數(shù)列表,使用jinfo的-flag選項(xiàng)進(jìn)行查詢未被顯式指定的參數(shù)的系統(tǒng)默認(rèn)值。
4.2.4 jmap:Java內(nèi)存映像工具
jmap(Memory Map for Java)命令用于生成堆轉(zhuǎn)儲(chǔ)快照,還可以查詢finalize執(zhí)行隊(duì)列、Java堆和方法區(qū)的詳細(xì)信息,如空間使用率、當(dāng)前用的是哪種收集器等。
4.2.5 jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具
jhat內(nèi)置了一個(gè)微型的HTTP/Web服務(wù)器,生成堆轉(zhuǎn)儲(chǔ)快照的分析結(jié)果后,可以在瀏覽器中查看。耗時(shí)而且極為耗費(fèi)硬件資源,分析功能相對(duì)來(lái)說(shuō)比較簡(jiǎn)陋。
4.2.6 jstack:Java堆棧跟蹤工具
用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照(一般稱為threaddump或者javacore文件),生成線程快照的目的通常是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間掛起等,都是導(dǎo)致線程長(zhǎng)時(shí)間停頓的常見(jiàn)原因。
4.2.7 基礎(chǔ)工具總結(jié)
在高版本的JDK中,這些工具大多已有了功能更為強(qiáng)大的替代品,譬如JCMD、JHSDB的命令行
模式,但使用方法也是相似的,無(wú)論JDK發(fā)展到了什么版本,學(xué)習(xí)這些基礎(chǔ)的工具命令并不會(huì)過(guò)時(shí)和浪費(fèi)。
4.3 可視化故障處理工具
4.3.1 JHSDB:基于服務(wù)性代理的調(diào)試工具
JHSDB是一款基于服務(wù)性代理(Serviceability Agent,SA)實(shí)現(xiàn)的進(jìn)程外調(diào)試工具。服務(wù)性代理是HotSpot虛擬機(jī)中一組用于映射Java虛擬機(jī)運(yùn)行信息的、主要基于Java語(yǔ)言(含少量JNI代碼)實(shí)現(xiàn)的API集合。在實(shí)際開(kāi)發(fā)、學(xué)習(xí)時(shí),可以用它來(lái)調(diào)試虛擬機(jī)進(jìn)程或者dump出來(lái)的內(nèi)存轉(zhuǎn)儲(chǔ)快照。
4.3.2 JConsole:Java監(jiān)視與管理控制臺(tái)
是一款基于JMX(Java Manage-ment Extensions)的可視化監(jiān)視、管理工具。它的主要功能是通過(guò)JMX的MBean(Managed Bean)對(duì)系統(tǒng)進(jìn)行信息收集和參數(shù)動(dòng)態(tài)調(diào)整。JMX是一種開(kāi)放性的技術(shù),不僅可以用在虛擬機(jī)本身的管理上,還可以運(yùn)行于虛擬機(jī)之上的軟件中。虛擬機(jī)對(duì)JMX
MBean的訪問(wèn)也是完全開(kāi)放的,可以使用代碼調(diào)用API、支持JMX協(xié)議的管理控制臺(tái),或者其他符合JMX規(guī)范的軟件進(jìn)行訪問(wèn)。
4.3.3 VisualVM:多合-故障處理工具
是功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序之一,它除了常規(guī)的運(yùn)行監(jiān)視、故障處理外,還將提供其他方面的能力,譬如性能分析(Profiling)。VisualVM還有一個(gè)很大的優(yōu)點(diǎn):不需要被監(jiān)視的
程序基于特殊Agent去運(yùn)行,因此它的通用性很強(qiáng),對(duì)應(yīng)用程序?qū)嶋H性能的影響也較小,使得它可以直接應(yīng)用在生產(chǎn)環(huán)境中。這個(gè)優(yōu)點(diǎn)是JProfiler、YourKit等第三方工具無(wú)法與之媲美的。
4.3.4 Java Mission Control:可持續(xù)在線的監(jiān)控工具
現(xiàn)在的JMC不僅可以下載到獨(dú)立程序,更常見(jiàn)的是作為Eclipse的插件來(lái)使用。JMC與虛擬機(jī)之間同樣采取JMX協(xié)議進(jìn)行通信,JMC一方面作為JMX控制臺(tái),顯示來(lái)自虛擬機(jī)MBean提供的數(shù)據(jù);另一方面作為JFR的分析工具,展示來(lái)自JFR的數(shù)據(jù)。
4.4 HotSpot虛擬機(jī)插件及工具
在HotSpot的研發(fā)過(guò)程中,開(kāi)發(fā)團(tuán)隊(duì)曾經(jīng)編寫(xiě)(或者收集)過(guò)不少虛擬機(jī)的插件和輔助工
具,它們存放在HotSpot源碼hotspot/src/share/tools目錄下,包括(含曾經(jīng)有過(guò)但新版本中已被移除的):
Ideal Graph Visualizer:用于可視化展示C2即時(shí)編譯器是如何將字節(jié)碼轉(zhuǎn)化為理想圖,然后轉(zhuǎn)化為機(jī)器碼的。
·Client Compiler Visualizer:用于查看C1即時(shí)編譯器生成高級(jí)中間表示(HIR),轉(zhuǎn)換成低級(jí)中間表示(LIR)和做物理寄存器分配的過(guò)程。
·MakeDeps:幫助處理HotSpot的編譯依賴的工具。
·Project Creator:幫忙生成Visual Studio的.project文件的工具。
·LogCompilation:將-XX:+LogCompilation輸出的日志整理成更容易閱讀的格式的工具。
·HSDIS:即時(shí)編譯器的反匯編插件。
4.5 本章小結(jié)
靈活使用這些工具,可以為處理問(wèn)題帶來(lái)很大的便利。除了本章涉及的OpenJDK中自帶的工具之外,還有很多其他監(jiān)控和故障處理工具,如何進(jìn)行監(jiān)控和故障診斷,這并不是《Java虛擬機(jī)規(guī)范》中定義的內(nèi)容,而是取決于虛擬機(jī)實(shí)現(xiàn)自身的設(shè)計(jì)。
總結(jié)
以上是生活随笔為你收集整理的《深入理解JAVA虚拟机》周志明 第三版 - 第四章 虚拟机性能监控、故障处理工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 周志明是谁?
- 下一篇: 【第64期】豆瓣9.8分,周志明的《凤凰