您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何使用JVM故障處理工具”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用JVM故障處理工具”吧!
用都用不到怎么學(xué)?
沒有場景、沒有訴求,怎么學(xué)習(xí)這些似乎用不上知識點(diǎn)。
其實(shí)最好的方式就是歸納、整理、實(shí)踐、輸出,一套組合拳下來,你就掌握了這個系列的知識了。
但在當(dāng)前階段可能真的用不上,JVM是一個穩(wěn)定服務(wù),哪能天天出問題,哪需要你老排查。又不是像你寫的代碼那樣!
可是知識的學(xué)習(xí)就是把你墊基到更高層次后,才有機(jī)會接觸更有意思的工作和技術(shù)創(chuàng)新。如果只是單純的學(xué)幾個指令,其實(shí)并沒有多有意思。但讓你完成一套全鏈路監(jiān)控,里面需要含有一次方法調(diào)用的整體耗時、執(zhí)行路徑、參數(shù)信息、異常結(jié)果、GC次數(shù)、堆棧數(shù)據(jù)、分代內(nèi)容等等的時候,那么你的知識儲備夠開發(fā)一個這樣的系統(tǒng)嗎?
好,先上圖看看本文要講啥,再跟著小傅哥的步伐往下走。
謝飛機(jī),小記!
,周末休息在家無聊,把已經(jīng)上灰了的JVM虛擬機(jī)學(xué)習(xí)翻出來。
「謝飛機(jī)」:呱...呱...,喂大哥,這個,這個JVM虛擬機(jī)看啥呀。
「面試官」:看啥?不知道從哪開始?嗯,那你從問題點(diǎn)下手!
「謝飛機(jī)」:啥問題點(diǎn)呢,我就是不知道自己不會啥,也不知道問你啥。
「面試官」:??!那我問你個,怎么通過JVM故障處理工具,查看JVM啟動時參數(shù)都配置了什么呢?
「謝飛機(jī)」:這個???不道呀!
「面試官」:那你熟悉的監(jiān)控指令都有啥,如果問你堆內(nèi)存統(tǒng)計(jì)如何統(tǒng)計(jì),你可知曉???
「謝飛機(jī)」:也不知道,哈哈哈,好像知道要去看啥了!
「面試官」:去吧,帶著問題看,看完整理出來!
jps(JVM Process Status Tool),它的功能與ps命令類似,可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程,并顯示虛擬機(jī)執(zhí)行主類(Main Class,main()函數(shù)所在的類)名稱以及這些進(jìn)程的本地虛擬機(jī)唯一ID(Local Virtual Machine Identifier,LVMID),類似于 ps -ef | grep java 的功能。
這小家伙雖然不大,功能又單一。但可以說基本你用其他命令都得先用它,來查詢到LVMID來確定要監(jiān)控的是哪個虛擬機(jī)進(jìn)程。
「命令格式」
jps [ options ] [ hostid ]
「選項(xiàng)列表」
選項(xiàng) | 描述 |
---|---|
-q | 只輸出進(jìn)程ID,忽略主類信息 |
-l | 輸出主類全名,或者執(zhí)行JAR包則輸出路徑 |
-m | 輸出虛擬機(jī)進(jìn)程啟動時傳遞給主類main()函數(shù)的參數(shù) |
-v | 輸出虛擬機(jī)進(jìn)程啟動時的JVM參數(shù) |
E:\itstack\git\github.com\interview>jps -q
104928
111552
26852
96276
59000
8460
76188
E:\itstack\git\github.com\interview>jps -l
111552 org/netbeans/Main
26852
96276 org.jetbrains.jps.cmdline.Launcher
59000
62184 sun.tools.jps.Jps
8460 org/netbeans/Main
76188 sun.tools.jstatd.Jstatd
-l
也是非常常用的一個參數(shù)選項(xiàng)。E:\itstack\git\github.com\interview>jps -m
111552 Main --branding visualvm --cachedir C:\Users\xiaofuge\AppData\Local\VisualVM\Cache/8u131 --openid 3041391569375200
26852
96276 Launcher C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/plugins/java/lib/javac2.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/plugins/java/lib/aether-api-1.1.0.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/lib/jna-platform.jar;C:/Program Fi
les/JetBrains/IntelliJ IDEA 2019.3.1/lib/guava-27.1-jre.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/lib/httpclient-4.5.10.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/lib/forms-1.1-preview.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/plu
gins/java/lib/aether-connector-basic-1.1.0.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/plugins/java/lib/maven-model-builder-3.3.9.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/lib/jps-model.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/plu
gins/java/lib/maven-model-3.3.9.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/plugins/java/lib/aether-impl-1.1.0.jar;C:/Program Files/JetBrains/IntelliJ IDEA 2019.3.1/lib/gson-2.8.5.jar;C:/Program File
59000
16844 Jps -m
8460 Main --branding visualvm --cachedir C:\Users\xiaofuge\AppData\Local\VisualVM\Cache/8u131 --openid 3041414336579200
76188 Jstatd
E:\itstack\git\github.com\interview>jps -v
111552 Main -Xms24m -Xmx256m -Dsun.jvmstat.perdata.syncWaitMs=10000 -Dsun.java2d.noddraw=true -Dsun.java2d.d3d=false -Dnetbeans.keyring.no.master=true -Dplugin.manager.install.global=false --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=jdk.jvmstat/sun
.jvmstat.monitor.event=ALL-UNNAMED --add-exports=jdk.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED --add-exports=java.desktop/sun.swing=ALL-UNNAMED --add-exports=jdk.attach/sun.tools.attach=ALL-UNNAMED --add-modules=java.activation -XX:+IgnoreUnrecognizedVMOptions -Djdk.
home=C:/Program Files/Java/jdk1.8.0_161 -Dnetbeans.home=C:\Program Files\Java\jdk1.8.0_161\lib\visualvm\platform -Dnetbeans.user=C:\Users\xiaofuge1\AppData\Roaming\VisualVM\8u131 -Dnetbeans.default_userdir_root=C:\Users\xiaofuge1\AppData\Roaming\VisualVM -XX:+H
eapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\xiaofuge1\AppData\Roaming\VisualVM\8u131\var\log\heapdump.hprof -Dsun.awt.keepWorkingSetOnMinimize=true -Dnetbeans.dirs=C:\Program Files\Java\jdk1.8.0_161\lib\visualvm\visualvm;C:\Program
59000 -Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:MaxPermSize=256m
76188 Jstatd -Denv.class.path=.;C:\Program Files\Java\jre1.8.0_161\lib;C:\Program Files\Java\jre1.8.0_161\lib\tool.jar; -Dapplication.home=C:\Program Files\Java\jdk1.8.0_161 -Xms8m -Djava.security.policy=jstatd.all.policy
jps 鏈接遠(yuǎn)程輸出JVM信息,需要注冊RMI,否則會報(bào)錯 RMI Registry not available at 127.0.0.1
。
注冊RMI開啟 jstatd 在你的 C:\Program Files\Java\jdk1.8.0_161\bin
目錄下添加名稱為 jstatd.all.policy
的文件。無其他后綴
「jstatd.all.policy」 文件內(nèi)容如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
添加好配置文件后,在 bin 目錄下注冊添加的 jstatd.all.policy
文件:C:\Program Files\Java\jdk1.8.0_161\bin>jstatd -J-Djava.security.policy=jstatd.all.policy
順利的話現(xiàn)在就可以查看原創(chuàng)機(jī)器JVM信息了,如下:
E:\itstack\git\github.com\interview>jps -l 127.0.0.1
111552 org/netbeans/Main
26852
96276 org.jetbrains.jps.cmdline.Launcher
36056 sun.tools.jps.Jps
59000
8460 org/netbeans/Main
76188 sun.tools.jstatd.Jstatd
jps -lm 127.0.0.1
jcmd,是從jdk1.7開始新發(fā)布的 JVM 相關(guān)信息診斷工具,可以用它來導(dǎo)出堆和線程信息、查看Java進(jìn)程、執(zhí)行GC、還可以進(jìn)行采樣分析(jmc 工具的飛行記錄器)。注意其使用條件是只能在被診斷的JVM同臺sever上,并且具有相同的用戶和組(user and group).
「命令格式」
jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
E:\itstack\git\github.com\interview>jcmd 111552 VM.flags
111552:
-XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\xiaofuge1\AppData\Roaming\VisualVM\8u131\var\log\heapdump.hprof -XX:+IgnoreUnrecognizedVMOptions -XX:InitialHeapSize=25165824 -XX:MaxHeapSize=268435456 -XX:MaxNewSize=89128960 -XX:Min
HeapDeltaBytes=524288 -XX:NewSize=8388608 -XX:OldSize=16777216 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
E:\itstack\git\github.com\interview>jcmd 111552 VM.uptime
111552:
583248.912 s
E:\itstack\git\github.com\interview>jcmd 111552 PerfCounter.print
111552:
java.ci.totalTime=56082522
java.cls.loadedClasses=5835
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=37
...
E:\itstack\git\github.com\interview>jcmd 111552 GC.class_histogram
111552:
num #instances #bytes class name
----------------------------------------------
1: 50543 3775720 [C
2: 3443 2428248 [I
3: 50138 1203312 java.lang.String
4: 25351 811232 java.util.HashMap$Node
5: 6263 712208 java.lang.Class
6: 3134 674896 [B
7: 6687 401056 [Ljava.lang.Object;
8: 2468 335832 [Ljava.util.HashMap$Node;
E:\itstack\git\github.com\interview>jcmd 111552 Thread.print
111552:
2021-01-10 23:31:13
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.161-b12 mixed mode):
"Computes values in handlers" #52 daemon prio=5 os_prio=0 tid=0x0000000019839000 nid=0x16014 waiting for monitor entry [0x0000000026bce000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.sun.tools.visualvm.core.model.ModelFactory.getModel(ModelFactory.java:76)
- waiting to lock <0x00000000f095bcf8> (a com.sun.tools.visualvm.jvmstat.application.JvmstatApplication)
at com.sun.tools.visualvm.application.jvm.JvmFactory.getJVMFor(JvmFactory.java:45)
at com.sun.tools.visualvm.application.options.Open.openApplication(Open.java:108)
at com.sun.tools.visualvm.application.options.Open.process(Open.java:93)
at org.netbeans.spi.sendopts.Option$1.process(Option.java:348)
at org.netbeans.api.sendopts.CommandLine.process(CommandLine.java:278)
at org.netbeans.modules.sendopts.HandlerImpl.execute(HandlerImpl.java:23)
at org.netbeans.modules.sendopts.Handler.cli(Handler.java:30)
at org.netbeans.CLIHandler.notifyHandlers(CLIHandler.java:195)
at org.netbeans.core.startup.CLICoreBridge.cli(CLICoreBridge.java:43)
at org.netbeans.CLIHandler.notifyHandlers(CLIHandler.java:195)
at org.netbeans.CLIHandler$Server$1ComputingAndNotifying.run(CLIHandler.java:1176)
E:\itstack\git\github.com\interview>jcmd 111552 VM.system_properties
111552:
#Sun Jan 13 23:33:19 CST 2021
java.vendor=Oracle Corporation
netbeans.user=C\:\\Users\\xiaofuge1\\AppData\\Roaming\\VisualVM\\8u131
sun.java.launcher=SUN_STANDARD
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
netbeans.autoupdate.version=1.23
os.name=Windows 10
E:\itstack\git\github.com\interview>jcmd 111552 GC.heap_dump C:\Users\xiaofuge1\Desktop\_dump_0110
111552:
Heap dump file created
E:\itstack\git\github.com\interview>jcmd 111552 help
111552:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
E:\itstack\git\github.com\interview>jcmd 111552 help JFR.stop
111552:
JFR.stop
Stops a JFR recording
Impact: Low
Permission: java.lang.management.ManagementPermission(monitor)
Syntax : JFR.stop [options]
Options: (options must be specified using the <key> or <key>=<value> syntax)
name : [optional] Recording name,.e.g \"My Recording\" (STRING, no default value)
recording : [optional] Recording number, see JFR.check for a list of available recordings (JLONG, -1)
discard : [optional] Skip writing data to previously specified file (if any) (BOOLEAN, false)
filename : [optional] Copy recording data to file, e.g. \"C:\Users\user\My Recording.jfr\" (STRING, no default value)
compress : [optional] GZip-compress "filename" destination (BOOLEAN, false)
jinfo(Configuration Info for Java),實(shí)時查看和調(diào)整JVM的各項(xiàng)參數(shù)。
在上面講到 jps -v
指令時,可以看到它把虛擬機(jī)啟動時顯式的參數(shù)列表都打印出來了,但如果想更加清晰的看具體的一個參數(shù)或者想知道未被顯式指定的參數(shù)時,就可以通過 jinfo -flag 來查詢了。
「命令格式」
jinfo [ option ] pid
「使用方式」
E:\itstack\git\github.com\interview>jinfo -flag MetaspaceSize 111552
-XX:MetaspaceSize=21807104
E:\itstack\git\github.com\interview>jinfo -flag MaxMetaspaceSize 111552
-XX:MaxMetaspaceSize=18446744073709486080
E:\itstack\git\github.com\interview>jinfo -flag HeapDumpPath 111552
-XX:HeapDumpPath=C:\Users\xiaofuge\AppData\Roaming\VisualVM\8u131\var\log\heapdump.hprof
jstat(JVM Statistics Monitoring Tool),用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息。它可以查看本地或者遠(yuǎn)程虛擬機(jī)進(jìn)程中,類加載、內(nèi)存、垃圾收集、即時編譯等運(yùn)行時數(shù)據(jù)。
「命令格式」
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
[protocol:][//]lvmid[@hostname[:port]/servername]
jstat -gc 111552 1000 5
「選項(xiàng)列表」
選項(xiàng) | 描述 |
---|---|
-class | 監(jiān)視類加載、卸載數(shù)量、總空間以及類裝載所耗費(fèi)時長 |
-gc | 監(jiān)視 Java 堆情況,包括Eden區(qū)、2個 Survivor區(qū)、老年代、永久代或者jdk1.8元空間等,容量、已用空間、垃圾收集時間合計(jì)等信息 |
-gccapacity | 監(jiān)視內(nèi)容與-gc基本一致,但輸出主要關(guān)注 Java 堆各個區(qū)域使用到的最大、最小空間 |
-gcutil | 監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關(guān)注已使用空間占總空間的百分比 |
-gccause | 與 -gcutil 功能一樣,但是會額外輸出導(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)注使用到的最大、最小空間 |
-compiler | 輸出即時編譯器編譯過的方法、耗時等信息 |
-printcompilation | 輸出已經(jīng)被即時編譯的方法 |
-gcpermcapacity | jdk1.7 及以下,永久代空間統(tǒng)計(jì) |
-gcmetacapacity | jdk1.8,元空間統(tǒng)計(jì) |
E:\itstack\git\github.com\interview>jstat -class 111552
Loaded Bytes Unloaded Bytes Time
5835 12059.6 37 53.5 3.88
E:\itstack\git\github.com\interview>jstat -compiler 111552
Compiled Failed Invalid Time FailedType FailedMethod
3642 0 0 5.61 0
E:\itstack\git\github.com\interview>jstat -gc 111552
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 512.0 0.0 0.0 77312.0 35.1 39424.0 13622.9 37120.0 34423.3 5376.0 4579.4 60 0.649 52 3.130 3.779
E:\itstack\git\github.com\interview>jstat -gccapacity 111552
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
8192.0 87040.0 80384.0 1024.0 512.0 77312.0 16384.0 175104.0 39424.0 39424.0 0.0 1081344.0 37120.0 0.0 1048576.0 5376.0 60 52
E:\itstack\git\github.com\interview>jstat -gcnewcapacity 111552
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
8192.0 87040.0 80384.0 28672.0 1024.0 28672.0 512.0 86016.0 77312.0 60 52
E:\itstack\git\github.com\interview>jstat -gcnew 111552
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
1024.0 512.0 0.0 0.0 3 15 512.0 77312.0 70.2 60 0.649
E:\itstack\git\github.com\interview>jstat -gcold 111552
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
37120.0 34423.3 5376.0 4579.4 39424.0 13622.9 60 52 3.130 3.779
E:\itstack\git\github.com\interview>jstat -gcoldcapacity 111552
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
16384.0 175104.0 39424.0 39424.0 60 52 3.130 3.779
E:\itstack\git\github.com\interview>jstat -gcmetacapacity 111552
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1081344.0 37120.0 0.0 1048576.0 5376.0 60 52 3.130 3.779
E:\itstack\git\github.com\interview>jstat -gcutil 111552
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 0.09 34.55 92.74 85.18 60 0.649 52 3.130 3.779
E:\itstack\git\github.com\interview>jstat -printcompilation 111552
Compiled Size Type Method
3642 9 1 java/io/BufferedWriter min
jmap(Memory Map for Java),用于生成堆轉(zhuǎn)儲快照(heapdump文件)。
jmap 的作用除了獲取堆轉(zhuǎn)儲快照,還可以查詢finalize執(zhí)行隊(duì)列、Java 堆和方法區(qū)的詳細(xì)信息。
「命令格式」
jmap [ option ] pid
「選項(xiàng)列表」
選項(xiàng) | 描述 |
---|---|
-dump | 生成 Java 堆轉(zhuǎn)儲快照。 |
-finalizerinfo | 顯示在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對象。Linux平臺 |
-heap | 顯示 Java 堆詳細(xì)信息,比如:用了哪種回收器、參數(shù)配置、分代情況。Linux平臺 |
-histo | 顯示堆中對象統(tǒng)計(jì)信息,包括類、實(shí)例數(shù)量、合計(jì)容量 |
-permstat | 顯示永久代內(nèi)存狀態(tài),jdk1.7,永久代 |
-F | 當(dāng)虛擬機(jī)進(jìn)程對 -dump 選項(xiàng)沒有響應(yīng)式,可以強(qiáng)制生成快照。Linux平臺 |
E:\itstack\git\github.com\interview>jmap 111552
Attaching to process ID 111552, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
0x000000005b4a0000 1632K C:\Program Files\Java\jdk1.8.0_161\jre\bin\awt.dll
0x000000005b8c0000 264K C:\Program Files\Java\jdk1.8.0_161\jre\bin\t2k.dll
0x000000005b910000 284K C:\Program Files\Java\jdk1.8.0_161\jre\bin\fontmanager.dll
0x000000005b960000 224K C:\Program Files\Java\jdk1.8.0_161\jre\bin\splashscreen.dll
0x000000005b9a0000 68K C:\Program Files\Java\jdk1.8.0_161\jre\bin\nio.dll
E:\itstack\git\github.com\interview>jmap -heap 111552
Attaching to process ID 111552, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 268435456 (256.0MB)
NewSize = 8388608 (8.0MB)
MaxNewSize = 89128960 (85.0MB)
OldSize = 16777216 (16.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
E:\itstack\git\github.com\interview> jmap -clstats 111552
Attaching to process ID 111552, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.................................................................liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive? type
<bootstrap> 3779 6880779 null live <internal>
0x00000000f03853b8 57 132574 0x00000000f031aac8 live org/netbeans/StandardModule$OneModuleClassLoader@0x00000001001684f0
0x00000000f01b9b98 0 0 0x00000000f031aac8 live org/netbeans/StandardModule$OneModuleClassLoader@0x00000001001684f0
0x00000000f005b280 0 0 0x00000000f031aac8 live java/util/ResourceBundle$RBClassLoader@0x00000001000c6ae0
0x00000000f01dfa98 0 0 0x00000000f031aac8 live org/netbeans/StandardModule$OneModuleClassLoader@0x00000001001684f0
0x00000000f01ec518 79 252894 0x00000000f031aac8 live org/netbeans/StandardModule$OneModuleClassLoader@0x00000001001684f0
E:\itstack\git\github.com\interview>jmap -dump:live,format=b,file=C:/Users/xiaofuge/Desktop/heap.bin 111552
Dumping heap to C:\Users\xiaofuge\Desktop\heap.bin ...
Heap dump file created
jhat(JVM Heap Analysis Tool),與jmap配合使用,用于分析jmap生成的堆轉(zhuǎn)儲快照。
jhat內(nèi)置了一個小型的http/web服務(wù)器,可以把堆轉(zhuǎn)儲快照分析的結(jié)果,展示在瀏覽器中查看。不過用途不大,基本大家都會使用其他第三方工具。
「命令格式」
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
「命令使用」
E:\itstack\git\github.com\interview>jhat -port 8090 C:/Users/xiaofuge1/Desktop/heap.bin
Reading from C:/Users/xiaofuge1/Desktop/heap.bin...
Dump file created Wed Jan 13 16:53:47 CST 2021
Snapshot read, resolving...
Resolving 246455 objects...
Chasing references, expect 49 dots.................................................
Eliminating duplicate references.................................................
Snapshot resolved.
Started HTTP server on port 8090
Server is ready.
「http://localhost:8090/」
jstack(Stack Trace for Java),用于生成虛擬機(jī)當(dāng)前時刻的線程快照(threaddump、javacore)。
線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的目的通常是定位線程出現(xiàn)長時間停頓的原因,如:線程死鎖、死循環(huán)、請求外部資源耗時較長導(dǎo)致掛起等。
線程出現(xiàn)聽頓時通過jstack來查看各個線程的調(diào)用堆棧,就可以獲得沒有響應(yīng)的線程在搞什么鬼。
「命令格式」
jstack [ option ] vmid
「選項(xiàng)參數(shù)」
選項(xiàng) | 描述 |
---|---|
-F | 當(dāng)正常輸出的請求不被響應(yīng)時,強(qiáng)制輸出線程堆棧 |
-l | 除了堆棧外,顯示關(guān)于鎖的附加信息 |
-m | 如果調(diào)用的是本地方法的話,可以顯示c/c++的堆棧 |
「命令使用」
E:\itstack\git\github.com\interview>jstack 111552
2021-01-10 23:15:03
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.161-b12 mixed mode):
"Inactive RequestProcessor thread [Was:StdErr Flush/org.netbeans.core.startup.logging.PrintStreamLogger]" #59 daemon prio=1 os_prio=-2 tid=0x000000001983a800 nid=0x688 in Object.wait() [0x0000000017fbf000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1939)
- locked <0x00000000fab31d88> (a java.lang.Object)
JConsole( Java Monitoring and Management Console),是一款基于JMX( Java Manage-ment Extensions) 的可視化監(jiān)視管理工具。
它的功能主要是對系統(tǒng)進(jìn)行收集和參數(shù)調(diào)整,不僅可以在虛擬機(jī)本身管理還可以開發(fā)在軟件上,是開放的服務(wù),有相應(yīng)的代碼API調(diào)用。
「JConsole 啟動」
「JConsole 使用」
VisualVM( All-in-One Java Troubleshooting Tool),是功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理工具之一。
它除了常規(guī)的運(yùn)行監(jiān)視、故障處理外,還可以做性能分析等工作。因?yàn)樗耐ㄓ眯院軓?qiáng),對應(yīng)用程序影響較小,所以可以直接接入到生產(chǎn)環(huán)境中。
「VisualVM IDEA安裝」
「VisualVM 使用」
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
ClassLoadingMXBean loadingBean = ManagementFactory.getClassLoadingMXBean();
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MetaSpaceOomMock.class);
enhancer.setCallbackTypes(new Class[]{Dispatcher.class, MethodInterceptor.class});
enhancer.setCallbackFilter(new CallbackFilter() {
@Override
public int accept(Method method) {
return 1;
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
});
System.out.println(enhancer.createClass().getName() + loadingBean.getTotalLoadedClassCount() + loadingBean.getLoadedClassCount() + loadingBean.getUnloadedClassCount());
}
}
「記得調(diào)整元空間大小」
-XX:MetaspaceSize=8m
-XX:MaxMetaspaceSize=80m
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7397
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
java.lang.OutOfMemoryError: Metaspace
「監(jiān)控結(jié)果」
到此,相信大家對“如何使用JVM故障處理工具”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。