日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第4章 虚拟机性能监控、故障处理工具(上)

發(fā)布時(shí)間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第4章 虚拟机性能监控、故障处理工具(上) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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.Jps

jps還可以通過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所示。

jstat -gcutil 6352S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT0.08 0.00 52.00 38.41 94.74 - 7466 12.813 872 148.919 - - 161.732

查詢結(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=-1

4.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 created

4.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é)果)

jstack -l 6352 2022-07-21 15:38:06 Full thread dump OpenJDK 64-Bit Client VM (11.0.11+9 mixed mode):Threads class SMR info: _java_thread_list=0x00000000576b7a90, length=59, elements={0x000000000399e000}"main" #1 prio=6 os_prio=0 cpu=531968.75ms elapsed=3211977.46s tid=0x000000000399e000 nid=0xf14 runnable [0x0000000000fcd000]java.lang.Thread.State: RUNNABLEat org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)at org.eclipse.swt.widgets.Display.sleep(Display.java:4709)at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:339)at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.eventLoopIdle(IDEWorkbenchAdvisor.java:982)at org.jkiss.dbeaver.ui.app.standalone.ApplicationWorkbenchAdvisor.eventLoopIdle(ApplicationWorkbenchAdvisor.java:285)at org.eclipse.ui.internal.Workbench$1.eventLoopIdle(Workbench.java:479)at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1162)at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644)at org.eclipse.ui.internal.Workbench$$Lambda$170/0x000000004bab50a8.run(Unknown Source)at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551)at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156)at org.jkiss.dbeaver.ui.app.standalone.DBeaverApplication.start(DBeaverApplication.java:265)at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@11.0.11/Native Method)at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@11.0.11/Unknown Source)at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.11/Unknown Source)at java.lang.reflect.Method.invoke(java.base@11.0.11/Unknown Source)at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)at org.eclipse.equinox.launcher.Main.run(Main.java:1461)Locked ownable synchronizers:- None

從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文件
javaJava運(yùn)行工具,用于運(yùn)行Class文件或JAR文件
javac用于Java編程語言的編譯器
javadocJava的API文檔生成器
javahC語言頭文件和Stub函數(shù)生成器,用于編寫JNI方法
javapJava字節(jié)碼分析工具
jlink將Module和它的依賴打包成一個(gè)運(yùn)行時(shí)鏡像文件
jdb基于JPDA協(xié)議的調(diào)試器,以類似于GDB的方式進(jìn)行調(diào)試Java代碼
jdepsJava類依賴性分析器
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ù)交互
名稱主要作用
rmicJava 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ù)的訪問
idljIDL 轉(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)行信息,排查問題
名稱主要作用
jpsJVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot 虛擬機(jī)進(jìn)程
jstatJVM Statistics Monitoring Tool ,用于收集HotSpot 虛擬機(jī)各方面的運(yùn)行數(shù)據(jù)
jstatdJVM 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中
jinfoConfiguration Info for Java,顯示虛擬機(jī)配置信息。在JDK9中集成到了JHSDB中
jmapMemory Map for Java,生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲(chǔ)快照(headdump文件)。在JDK9中集成到了JHSDB中
jhatJVM Heap Analysis Tool,用于分析堆轉(zhuǎn)儲(chǔ)快照,它會(huì)建立一個(gè)HTTP/Web服務(wù)器,讓用戶可以在瀏覽器上查看分析結(jié)果。在JDK9中集成到了JHSDB中
jhsdbJava HotSpot Debugger,一個(gè)基于Serviceability Agent 的HotSpot 進(jìn)程調(diào)試器,從JDK9 開始提供
jsadebugdJava Serviceability Agent Debug Daemon,用于Java的可維護(hù)性代理調(diào)試守護(hù)程序,主要用于附加到指定的Java進(jìn)程、核心文件,或充當(dāng)一個(gè)調(diào)試服務(wù)器
jcmdJVM Command,虛擬機(jī)診斷命令工具,將診斷命令請求發(fā)送到正在運(yùn)行的Java虛擬機(jī)。
jconsoleJava Console ,用于監(jiān)控Java虛擬機(jī)的使用JMX規(guī)范的圖形工具。它可以監(jiān)控本地和遠(yuǎn)程Java虛擬機(jī),還可以監(jiān)控和管理應(yīng)用程序。
jmcJava Mission Control , 包含用于監(jiān)控和管理Java應(yīng)用程序的工具,而不會(huì)引入與這些工具相關(guān)聯(lián)的性能開銷。開發(fā)者可以使用jmc命令來創(chuàng)建JMC工具
jvisualvmJava 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文件
wsgenXML Web Service 2.0 的Java API,生成用于JAX-WS Web Service 的JAX-WS便攜式產(chǎn)物
wsimportXML 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)境
jrunscriptJava命令行腳本外殼工具(Conmmand Line Script Shell),主要用于解釋執(zhí)行javas、Groovy、Ruby等腳本語言

總結(jié)

以上是生活随笔為你收集整理的第4章 虚拟机性能监控、故障处理工具(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。