做者:小傅哥
博客:https://bugstack.cnhtml
沉澱、分享、成長,讓本身和他人都能有所收穫!😄
用都用不到怎麼學?
java
沒有場景、沒有訴求,怎麼學習這些彷佛用不上知識點。c++
其實最好的方式就是概括、整理、實踐、輸出,一套組合拳下來,你就掌握了這個系列的知識了。git
但在當前階段可能真的用不上,JVM是一個穩定服務,哪能每天出問題,哪須要你老排查。又不是像你寫的代碼那樣!
github
但是知識的學習就是把你墊基到更高層次後,纔有機會接觸更有意思的工做和技術創新。若是隻是單純的學幾個指令,其實並無多有意思。但讓你完成一套全鏈路監控,裏面須要含有一次方法調用的總體耗時、執行路徑、參數信息、異常結果、GC次數、堆棧數據、分代內容等等的時候,那麼你的知識儲備夠開發一個這樣的系統嗎?web
好,先上圖看看本文要講啥,再跟着小傅哥的步伐往下走。面試
謝飛機,小記!
,週末休息在家無聊,把已經上灰了的JVM虛擬機學習翻出來。編程
謝飛機:呱...呱...,喂大哥,這個,這個JVM虛擬機看啥呀。bootstrap
面試官:看啥?不知道從哪開始?嗯,那你從問題點下手!api
謝飛機:啥問題點呢,我就是不知道本身不會啥,也不知道問你啥。
面試官:啊!那我問你個,怎麼經過JVM故障處理工具,查看JVM啓動時參數都配置了什麼呢?
謝飛機:這個!?不道呀!
面試官:那你熟悉的監控指令都有啥,若是問你堆內存統計如何統計,你可知曉!?
謝飛機:也不知道,哈哈哈,好像知道要去看啥了!
面試官:去吧,帶着問題看,看完整理出來!
jps(JVM Process Status Tool),它的功能與ps命令相似,能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class,main()函數所在的類)名稱以及這些進程的本地虛擬機惟一ID(Local Virtual Machine Identifier,LVMID),相似於 ps -ef | grep java 的功能。
這小傢伙雖然不大,功能又單一。但能夠說基本你用其餘命令都得先用它,來查詢到LVMID來肯定要監控的是哪一個虛擬機進程。
命令格式
jps [ options ] [ hostid ]
選項列表
選項 | 描述 |
---|---|
-q | 只輸出進程ID,忽略主類信息 |
-l | 輸出主類全名,或者執行JAR包則輸出路徑 |
-m | 輸出虛擬機進程啓動時傳遞給主類main()函數的參數 |
-v | 輸出虛擬機進程啓動時的JVM參數 |
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
也是很是經常使用的一個參數選項。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 連接遠程輸出JVM信息,須要註冊RMI,不然會報錯 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 文件內容以下:
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
順利的話如今就能夠查看原創機器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開始新發布的 JVM 相關信息診斷工具,能夠用它來導出堆和線程信息、查看Java進程、執行GC、還能夠進行採樣分析(jmc 工具的飛行記錄器)。注意其使用條件是隻能在被診斷的JVM同臺sever上,而且具備相同的用戶和組(user and group).
命令格式
jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
pid,接收診斷命令請求的進程ID
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),實時查看和調整JVM的各項參數。
在上面講到 jps -v
指令時,能夠看到它把虛擬機啓動時顯式的參數列表都打印出來了,但若是想更加清晰的看具體的一個參數或者想知道未被顯式指定的參數時,就能夠經過 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),用於監視虛擬機各類運行狀態信息。它能夠查看本地或者遠程虛擬機進程中,類加載、內存、垃圾收集、即時編譯等運行時數據。
命令格式
`jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
`
[protocol:][//]lvmid[@hostname[:port]/servername]
jstat -gc 111552 1000 5
選項列表
選項 | 描述 |
---|---|
-class | 監視類加載、卸載數量、總空間以及類裝載所耗費時長 |
-gc | 監視 Java 堆狀況,包括Eden區、2個 Survivor區、老年代、永久代或者jdk1.8元空間等,容量、已用空間、垃圾收集時間合計等信息 |
-gccapacity | 監視內容與-gc基本一致,但輸出主要關注 Java 堆各個區域使用到的最大、最小空間 |
-gcutil | 監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比 |
-gccause | 與 -gcutil 功能同樣,可是會額外輸出致使上一次垃圾收集產生的緣由 |
-gcnew | 監視新生代垃圾收集狀況 |
-gcnewcapacity | 監視內容與 -gcnew 基本相同,輸出主要關注使用到的最大、最小空間 |
-gcold | 監視老年代垃圾收集狀況 |
-gcoldcapacity | 監視內容與 -gcold 基本相同,輸出主要關注使用到的最大、最小空間 |
-compiler | 輸出即時編譯器編譯過的方法、耗時等信息 |
-printcompilation | 輸出已經被即時編譯的方法 |
-gcpermcapacity | jdk1.7 及如下,永久代空間統計 |
-gcmetacapacity | jdk1.8,元空間統計 |
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),用於生成堆轉儲快照(heapdump文件)。
jmap 的做用除了獲取堆轉儲快照,還能夠查詢finalize執行隊列、Java 堆和方法區的詳細信息。
命令格式
jmap [ option ] pid
選項列表
選項 | 描述 |
---|---|
-dump | 生成 Java 堆轉儲快照。 |
-finalizerinfo | 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象。Linux平臺 |
-heap | 顯示 Java 堆詳細信息,好比:用了哪一種回收器、參數配置、分代狀況。Linux平臺 |
-histo | 顯示堆中對象統計信息,包括類、實例數量、合計容量 |
-permstat | 顯示永久代內存狀態,jdk1.7,永久代 |
-F | 當虛擬機進程對 -dump 選項沒有響應式,能夠強制生成快照。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生成的堆轉儲快照。
jhat內置了一個小型的http/web服務器,能夠把堆轉儲快照分析的結果,展現在瀏覽器中查看。不過用途不大,基本你們都會使用其餘第三方工具。
命令格式
`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),用於生成虛擬機當前時刻的線程快照(threaddump、javacore)。
線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的目的一般是定位線程出現長時間停頓的緣由,如:線程死鎖、死循環、請求外部資源耗時較長致使掛起等。
線程出現聽頓時經過jstack來查看各個線程的調用堆棧,就能夠得到沒有響應的線程在搞什麼鬼。
命令格式
jstack [ option ] vmid
選項參數
選項 | 描述 |
---|---|
-F | 當正常輸出的請求不被響應時,強制輸出線程堆棧 |
-l | 除了堆棧外,顯示關於鎖的附加信息 |
-m | 若是調用的是本地方法的話,能夠顯示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) 的可視化監視管理工具。
它的功能主要是對系統進行收集和參數調整,不只能夠在虛擬機自己管理還能夠開發在軟件上,是開放的服務,有相應的代碼API調用。
JConsole 啓動
JConsole 使用
VisualVM( All-in-One Java Troubleshooting Tool),是功能最強大的運行監視和故障處理工具之一。
它除了常規的運行監視、故障處理外,還能夠作性能分析等工做。由於它的通用性很強,對應用程序影響較小,因此能夠直接接入到生產環境中。
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()); } }
記得調整元空間大小
-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
監控結果