基礎(chǔ)工具
jps:虛擬機(jī)進(jìn)程狀態(tài)工具
jps 命令格式:jps [options] [hostid]
命令可選項(xiàng)解釋:
選項(xiàng) | 解釋 |
---|---|
-q | 只輸出 LVMID,省略主類的名稱 |
-m | 輸出傳給 main 函數(shù)的參數(shù) |
-l | 輸出主類的全名,如果進(jìn)程運(yùn)行的 JAR 包,則輸出 JAR 包的路徑 |
-v | 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)的 JVM 參數(shù) |
jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
jstat(JVM Statistics Monitoring Tool)是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具,在沒有 GUI 圖像界面、只提供了純文本控制臺(tái)環(huán)境的服務(wù)器上,它將是運(yùn)行期定位虛擬機(jī)性能問題的常用工具。
它既可以連接本地虛擬機(jī)也可以連接遠(yuǎn)程虛擬機(jī),如果連接遠(yuǎn)程虛擬機(jī),那 VMID 的格式應(yīng)當(dāng)是:[protocol:][//]lvmid[@hostname[:port]/servername]
。
jstat 命令格式:jstat [option vmid [interval[s|ms] [count]]]
參數(shù) interval 和 count 代表查詢間隔和次數(shù),如果省略這兩個(gè)參數(shù),說明只查詢一次;下面的命令查詢 vmid 為 2764 的 JVM 進(jìn)程,且每 250 毫秒查詢一次,一共查詢 20 次。
$ jstat -gc 2764 250 20
可選項(xiàng)參數(shù)如下:
可選項(xiàng) | 作用 |
---|---|
-class | 監(jiān)視類加載、卸載數(shù)量、總空間以及類加載所耗費(fèi)的時(shí)間 |
-gc | 監(jiān)視 Java 堆狀況,包括 Eden 區(qū)、2 個(gè) Survivor 區(qū)、老年代、永久代等的容量,已用空間,垃圾收集時(shí)間合計(jì)等信息 |
-gccapacity | 監(jiān)視內(nèi)容與 -gc 基本相同,但輸出主要關(guān)注 Java 堆各個(gè)區(qū)域使用到的最大、最小空間 |
-gcutil | 監(jiān)視內(nèi)容與 -gc 基本相同,但輸出主要關(guān)注已使用空間占總空間的百分比 |
-gccause | 與 -gcutil 功能一樣,但是會(huì)額外輸出導(dǎo)致上一次垃圾收集產(chǎn)生的原因 |
-gcnew | 監(jiān)視新生代垃圾收集狀況 |
-gcnewcapacity | 監(jiān)視內(nèi)容與 -gcnew 基本相同,輸出主要關(guān)注使用到的最大、最小空間 |
-gcold | 監(jiān)視老年代垃圾收集狀況 |
-gcoldcapacity | 監(jiān)視內(nèi)容與 -gcold 基本相同,輸出主要關(guān)注使用到的最大、最小空間 |
-gcpermcapacity | 輸出永久代使用到的最大、最小空間 |
-compiler | 輸出即時(shí)編譯器編譯過的方法、耗時(shí)等信息 |
-printcompilation | 輸出已經(jīng)被即時(shí)編譯的方法 |
示例如下:
本地啟動(dòng)一個(gè) Tomcat 服務(wù),然后用 jps
命令獲取 vmid 為 17260
。
$ jps -l
11232 org.jetbrains.idea.maven.server.RemoteMavenServer36
5940 org.jetbrains.jps.cmdline.Launcher
15784
16828 org.jetbrains.jps.cmdline.Launcher
17260 org.apache.catalina.startup.Bootstrap
5244 sun.tools.jps.Jps
使用 jstat
命令查看 JVM 內(nèi)存使用情況和 gc 的統(tǒng)計(jì)信息。
輸出列對(duì)應(yīng)的含義如下:
列名 | 描述 |
---|---|
S0C | 年輕代中第一個(gè) survivor 區(qū)的容量(字節(jié)) |
S1C | 年輕代中第二個(gè) survivor 區(qū)的容量(字節(jié)) |
S0U | 年輕代中第一個(gè) survivor 區(qū)目前已使用的容量(字節(jié)) |
S1U | 年輕代中第二個(gè) survivor 區(qū)目前已使用的容量(字節(jié)) |
EC | 年輕代中 Eden 的容量(字節(jié)) |
EU | 年輕代中 Eden 目前已使用的容量(字節(jié)) |
OC | 老年代的容量(字節(jié)) |
OU | 老年代目前已使用的容量(字節(jié)) |
MC | 方法區(qū)大?。ㄗ止?jié)) |
MU | 方法區(qū)目前已使用的容量(字節(jié)) |
CCSC | 壓縮類空間大小(字節(jié)) |
CCSU | 壓縮類空間已使用大?。ㄗ止?jié)) |
YGC | 從應(yīng)用程序啟動(dòng)到采樣時(shí)年輕代中 minor gc 次數(shù) |
YGCT | 從應(yīng)用程序啟動(dòng)到采樣時(shí)年輕代中 minor gc 所用時(shí)間(s) |
FGC | 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full gc 的次數(shù) |
FGCT | 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full gc 所用時(shí)間(s) |
GCT | 從應(yīng)用程序啟動(dòng)到采樣時(shí) gc 用的總時(shí)間(s) |
從 jstat
命令展示的信息可知,啟動(dòng) Tomcat 后進(jìn)行了 3 次
jinfo:Java 配置信息工具
jinfo(Configuration Info for Java)的作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)。我們知道 JVM 在啟動(dòng)的時(shí)候有非常多的配置參數(shù),比如堆大小、垃圾收集器等,在沒有顯示指定的情況下,這些參數(shù)有默認(rèn)值,當(dāng)我們向查看這個(gè)默認(rèn)值是多少的時(shí)候,就可以使用 jinfo
命令,jinfo
命令還支持動(dòng)態(tài)修改部分 JVM 參數(shù)。
jinfo
命令使用說明如下:
jinfo 命令可選項(xiàng)的含義:
可選項(xiàng) | 含義 |
---|---|
-flag <name>/-flag [+|-]<name> | 打印指定 JVM 參數(shù)的值,也可以啟用/禁用指定的 JVM 參數(shù) |
-flags | 打印 JVM 參數(shù) |
-sysprops | 打印 Java 系統(tǒng)屬性 |
其中 pid 就是通過 jps 查詢到的 vmid,兩個(gè)的值是一樣的。
# 打印 VM 參數(shù)
$ jinfo -flags 17260
Attaching to process ID 17260, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.311-b11
Non-default VM flags: -XX:CICompilerCount=12 -XX:InitialHeapSize=232783872 -XX:+ManagementServer -XX:MaxHeapSize=3722444800 -XX:MaxNewSize=1240465408 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=77594624 -XX:OldSize=155189248 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -Djava.util.logging.config.file=C:\Users\animal\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_servlet-webapp_2\conf\logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:53422,suspend=y,server=n -javaagent:C:\Users\animal\AppData\Local\JetBrains\IntelliJIdea2020.1\captureAgent\debugger-agent.jar -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=C:\Users\animal\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_servlet-webapp_2\jmxremote.password -Dcom.sun.management.jmxremote.access.file=C:\Users\animal\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_servlet-webapp_2\jmxremote.access -Djava.rmi.server.hostname=127.0.0.1 -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -Dcatalina.base=C:\Users\animal\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_servlet-webapp_2 -Dcatalina.home=D:\IT\tomcat\apache-tomcat-8.5.78-windows-x64\apache-tomcat-8.5.78 -Djava.io.tmpdir=D:\IT\tomcat\apache-tomcat-8.5.78-windows-x64\apache-tomcat-8.5.78\temp
# 查看最大堆內(nèi)存參數(shù)的值
$ jinfo -flag MaxHeapSize 17260
-XX:MaxHeapSize=3722444800
jmap:Java 內(nèi)存映像工具
jmap(Memory Map for Java)命令用于生成堆轉(zhuǎn)儲(chǔ)快照,除了 jmap 命令,還可以使用 -XX:HeapDumpOnOutOfMemoryError
參數(shù)讓虛擬機(jī)在內(nèi)存溢出異常出現(xiàn)之后自動(dòng)生成堆轉(zhuǎn)儲(chǔ)快照文件。
jmap 命令的使用說明如下:
jmap 命令可選項(xiàng)的含義如下:
可選項(xiàng) | 含義 |
---|---|
-heap | 打印 Java 堆詳細(xì)信息,如使用哪種收集器、JVM 參數(shù)、分代狀況等 |
-dump:<dump-options> | 生成 Java 堆轉(zhuǎn)儲(chǔ)快照,dump-options 參數(shù)有 live:只 dump 存活的對(duì)象,如果沒有指定,則 dump 出堆中的所有對(duì)象;format=b:二進(jìn)制格式;file=<file>:dump 到指定文件,示例:jmap -dump:live,format=b,file=heap.bin <pid>
|
-F | 當(dāng)虛擬機(jī)進(jìn)程對(duì) -dump 選項(xiàng)沒有響應(yīng)時(shí),可使用這個(gè)選項(xiàng)強(qiáng)制生成 dump 快照,在這種模式下不支持 “l(fā)ive” 子選項(xiàng) |
下面實(shí)戰(zhàn)演示一下:
# 該選項(xiàng)的輸出類似于 jinfo 命令,但是多了堆配置參數(shù)和垃圾收集器
$ jmap -heap 17260
Attaching to process ID 17260, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.311-b11
using thread-local object allocation.
Parallel GC with 13 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 3722444800 (3550.0MB)
NewSize = 77594624 (74.0MB)
MaxNewSize = 1240465408 (1183.0MB)
OldSize = 155189248 (148.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 58720256 (56.0MB)
used = 58026680 (55.33855438232422MB)
free = 693576 (0.6614456176757812MB)
98.81884711129325% used
From Space:
capacity = 9437184 (9.0MB)
used = 0 (0.0MB)
free = 9437184 (9.0MB)
0.0% used
To Space:
capacity = 9437184 (9.0MB)
used = 0 (0.0MB)
free = 9437184 (9.0MB)
0.0% used
PS Old Generation
capacity = 109576192 (104.5MB)
used = 15419240 (14.704933166503906MB)
free = 94156952 (89.7950668334961MB)
14.071706379429575% used
17183 interned Strings occupying 1607936 bytes.
# 生成堆轉(zhuǎn)儲(chǔ)快照文件
$ jmap -dump:file=heap.bin 17260
Dumping heap to D:\IT\heap.bin ...
Heap dump file created
執(zhí)行 jmap -dump:file=heap.bin 17260
命令之后,可以看到在當(dāng)前目錄下生成了名為 heap.bin 的文件,它是一個(gè)二進(jìn)制文件,用文本格式打開會(huì)顯示亂碼。
jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具
不管你是通過 -XX:HeapDumpOnOutOfMemoryError
參數(shù)還是通過 jmap 得到的堆轉(zhuǎn)儲(chǔ)快照文件,由于它是一個(gè)二進(jìn)制文件,所以要分析它必須要另外的工具,jhat 就是用來分析堆轉(zhuǎn)儲(chǔ)快照的命令行工具。
jhat 內(nèi)置了一個(gè)微型的 HTTP/Web 服務(wù)器,生成堆轉(zhuǎn)儲(chǔ)快照的分析結(jié)果后,可以在瀏覽器中查看。因?yàn)榉治龆艳D(zhuǎn)儲(chǔ)快照是一個(gè)耗時(shí)且耗費(fèi)硬件資源的過程,因此不要再部署應(yīng)用程序的服務(wù)器上直接分析堆轉(zhuǎn)儲(chǔ)快照文件,而是將其復(fù)制到其他服務(wù)器上再進(jìn)行分析。
jhat 命令的使用說明如下:
使用 jhat 命令來分析之前用 jmap 得到的堆轉(zhuǎn)儲(chǔ)快照文件 heap.bin 文件。
$ jhat heap.bin
Reading from heap.bin...
Dump file created Wed Oct 04 12:09:18 CST 2023
Snapshot read, resolving...
Resolving 208424 objects...
Chasing references, expect 41 dots.........................................
Eliminating duplicate references.........................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
看到上面的輸出結(jié)果說明分析成功,因?yàn)槟J(rèn)端口號(hào)是 7000(這一點(diǎn)也可以從 jhat 命令的輸出中看出來),所以我們?cè)跒g覽器中鍵入 http://127.0.0.1:7000
查看分析結(jié)果。頁(yè)面如下:
分析結(jié)果默認(rèn)以包為單位進(jìn)行分組顯示,分析內(nèi)存泄露問題主要會(huì)使用到其中的 “Heap Histogram”(與 jmap -hsito 功能一樣)與 OQL 頁(yè)簽的功能,前者可以找到內(nèi)存中總?cè)萘孔畲蟮膶?duì)象,后者是標(biāo)準(zhǔn)的對(duì)象查詢語言,使用類似 SQL 的語法對(duì)內(nèi)存中的對(duì)象進(jìn)行查詢統(tǒng)計(jì)。
jstack:Java 堆棧跟蹤工具
jstack(Stack Trace for Java)命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照(一般稱為 threaddump 或者 javacore 文件)。線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的目的通常是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間掛起等,都是導(dǎo)致線程長(zhǎng)時(shí)間停頓的常見原因。線程出現(xiàn)停頓時(shí)通過 jstack 來查看各個(gè)線程的調(diào)用堆棧,就可以獲知沒有響應(yīng)的線程到底在后臺(tái)做些什么事情,或者等待著什么資源。
jstack 命令的使用說明:
可選項(xiàng)的含義:
可選項(xiàng) | 含義 |
---|---|
-F | 當(dāng)正常輸出的請(qǐng)求不被響應(yīng)時(shí),強(qiáng)制輸出線程堆棧 |
-l | 除堆棧信息外,顯示關(guān)于鎖的附加信息 |
-m | 打印調(diào)用本地方法的堆棧信息 |
# jstack 會(huì)打印所有線程的堆棧信息,這里只展示了前三個(gè)線程
$ jstack -l 17260
2023-10-04 12:45:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.311-b11 mixed mode):
"http-nio-8080-AsyncTimeout" #47 daemon prio=5 os_prio=0 tid=0x00000111f42bc000 nid=0xa20 waiting on condition [0x0000000159efe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1256)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"http-nio-8080-Acceptor" #46 daemon prio=5 os_prio=0 tid=0x00000111f42b8000 nid=0x3910 runnable [0x0000000159dfe000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:424)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:252)
- locked <0x00000006e283b9f8> (a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:455)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:71)
at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:129)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"http-nio-8080-Poller" #45 daemon prio=5 os_prio=0 tid=0x00000111f42b9800 nid=0x230c runnable [0x0000000159cfe000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278)
at sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00000006e2856638> (a sun.nio.ch.Util$3)
- locked <0x00000006e2856648> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000006e28565b8> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:716)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
從 JDK 5 開始,java.lang.Thread 類新增了一個(gè) getAllStackTraces() 方法用于獲取虛擬機(jī)中所有線程的 StackTraceElement 對(duì)象,使用這個(gè)方法可以通過簡(jiǎn)單的幾行代碼完成 jstack 的大部分功能,我們可以使用這個(gè)方法來做一個(gè)管理員頁(yè)面,可以隨時(shí)使用瀏覽器來查看線程堆棧。
可視化工具
JDK 中除了附帶大量的命令行工具外,還提供了幾個(gè)功能集成度更高的可視化工具,用戶可以使用這些可視化工具以更加便捷的方式進(jìn)行進(jìn)程故障診斷和調(diào)試工作。這些工具主要包括 JConsole、VisualVM 和 JMC,其中 JConsole 在 JDK 5 中發(fā)布,VisualVM 在 JDK 6 中發(fā)布,Java Mission Control(JMC)在 JDK 7 中發(fā)布。
JConsole:Java 監(jiān)視與管理控制臺(tái)
JConsole(Java Monitoring and Management Console)是一款基于 JMX(Java Management Extensions)的可視化監(jiān)視、管理工具。它的主要功能是通過 JMX 的 MBean(Managed Bean)對(duì)系統(tǒng)進(jìn)行信息收集和參數(shù)動(dòng)態(tài)調(diào)整。JMX 是一種開發(fā)性的技術(shù),不僅可以用在虛擬機(jī)本身的管理上,還可以運(yùn)行于虛擬機(jī)之上的軟件中。
通過 JDK/bin 目錄下的 jconsole.exe 啟動(dòng) JConsole 后,會(huì)自動(dòng)搜索出本機(jī)運(yùn)行的所有虛擬機(jī)進(jìn)程,而不需要用戶自己使用 jps 來查詢,如下圖所示:
選擇要監(jiān)控的 JVM 進(jìn)程,點(diǎn)擊 “連接” 按鈕進(jìn)入 JConsole 主界面,主界面里共包括 “概述”、“內(nèi)存”、“線程”、“類”、“VM 摘要” 和 “MBean” 六個(gè)頁(yè)簽。
頁(yè)簽的作用如下:
- 概述:顯示整個(gè)虛擬機(jī)主要運(yùn)行數(shù)據(jù)的概覽信息,包括 “堆內(nèi)存使用情況”、“線程”、“類”、“CPU 使用情況” 四項(xiàng)信息的曲線圖。
- 內(nèi)存:相當(dāng)于可視化的 jstat 命令,用于監(jiān)視被收集器管理的虛擬機(jī)內(nèi)存的變化趨勢(shì)。
- 線程:相當(dāng)于可視化的 jstack 命令,遇到線程停頓的時(shí)候可以使用這個(gè)頁(yè)簽的功能進(jìn)行分析。
- 類:顯示虛擬機(jī)中類的統(tǒng)計(jì)信息
- VM 摘要:當(dāng)前連接的 VM 的摘要信息
在診斷 JVM 故障的時(shí)候我們最長(zhǎng)使用 “內(nèi)存” 和 “線程” 頁(yè)簽。
Java VisualVM:多合一故障處理工具
VisualVM(All-in-One Java Troubleshooting Tool)是功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序之一,曾經(jīng)在很長(zhǎng)一段時(shí)間內(nèi)是 Oracle 官方主力發(fā)展的虛擬機(jī)故障處理工具。Oracle 曾在 VisualVM 的軟件說明中寫上了 “All-in-One” 的字樣,預(yù)示著它除了常規(guī)的運(yùn)行監(jiān)視、故障處理外,還將提供其他方面的能力,例如性能分析。
VisualVM 基于 NetBeans 平臺(tái)開發(fā)工具,所以它具備通過插件擴(kuò)展功能的能力,有了插件擴(kuò)展支持,VisualVM 可以做到:
- 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置、環(huán)境信息(jps、jinfo)
- 監(jiān)控應(yīng)用程序的處理器、垃圾收集、堆、方法區(qū)以及線程的信息(jstat、jstack)
- dump 以及分析堆棧轉(zhuǎn)儲(chǔ)快照(jmap、jhat)
- 方法級(jí)的程序運(yùn)行性能分析,找出被調(diào)用最多、運(yùn)行時(shí)間最長(zhǎng)的方法
- 離線程序快照:收集程序的運(yùn)行時(shí)配置、線程 dump、內(nèi)存 dump 等信息建立一個(gè)快照,可以將快照發(fā)送開發(fā)者處進(jìn)行 Bug 反饋
- 其他插件帶來的無限可能性
初始狀態(tài)下的 VisualVM 并沒有加載任何插件,雖然基本的監(jiān)視、線程面板的功能主程序都以默認(rèn)插件的形式提供。
通過雙擊 %JAVA_HOME%/bin/jvisualvm.exe 來啟動(dòng) VisualVM,主頁(yè)面如下:
Java Mission Control:可支持在線的監(jiān)控工具
和前面兩款免費(fèi)的可視化工具不同,JMC 如果要在生產(chǎn)環(huán)境使用需要商業(yè)授權(quán)才行,但是在個(gè)人開發(fā)環(huán)境下仍然是免費(fèi)的。
需要注意的是,JDK 8 并不包含 JMC,你如果想要嘗試 JMC 需要單獨(dú)下載它,官方的下載地址是:https://jdk.java.net/jmc/,截至 2023-10-04,JMC 的最新版本是 JMC 8.3.1,從 JMC 8.1 開始運(yùn)行 JMC 的 JDK 版本要求是 JDK 11 及以上,JMC 8.0 仍然仍然可以運(yùn)行在 JDK 8 之上,所以你本地安裝的是 JDK 8 的話,那么你需要下載 JMC 8.0 版本。
但是官網(wǎng)只提供了最新版本的下載連接,stackoverflow 上這個(gè)問題的答案列出了其他下載 JMC 發(fā)行版的地址,其中一個(gè)地址是:https://adoptium.net/zh-CN/jmc/,你可以在這個(gè)地址中下載到 JMC 8.0 版本。
解壓之后的目錄結(jié)構(gòu)如下:
其中 jmc.imi 是配置文件,在啟動(dòng) JMC 之前,你需要在 jmc.ini 文件中設(shè)置編碼格式為 UTF-8,否則啟動(dòng)之后會(huì)出現(xiàn)亂碼,在 jmc.ini 文件中添加一下內(nèi)容即可:
-Dfile.encoding=UTF-8
最后雙擊 jmc.exe 啟動(dòng) JMC。文章來源:http://www.zghlxwxcb.cn/news/detail-726162.html
在 ”JVM 瀏覽器“ 頁(yè)簽中展示了本機(jī)上正在運(yùn)行的 JVM,雙擊其中一個(gè)進(jìn)行連接,把連接后的進(jìn)程展開可以看到每個(gè)進(jìn)程的數(shù)據(jù)都有 MBean 和 JFR 兩個(gè)數(shù)據(jù)來源。關(guān)于 MBean 這部分?jǐn)?shù)據(jù),與 JConsole 和 VisualVM 上取的內(nèi)容是一樣的,只是展示形式上有些差別。JFR 是和 MBean 不同的數(shù)據(jù)收集方式,它對(duì)被分析 JVM 程序性能影響和數(shù)據(jù)的質(zhì)量都要比使用 MBean 要高。文章來源地址http://www.zghlxwxcb.cn/news/detail-726162.html
到了這里,關(guān)于JVM 性能監(jiān)控與故障處理工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!