jstat,jinfo,jmap,jhat,jstack ╰+哭是因爲堅強的太久メ 2023-01-01 06:53 58阅读 0赞 > 内容大纲: > > 涵盖java以下常用工具的概念和用法,及其常用案例 > > jps,jstat,jinfo,jmap,jhat,jstack ## jps ## 使用频率最高的JDK命令工具:可以列出正在运行的JVM进程,并可以显示出JVM执行主类和进程号(LVMID:本地虚拟机唯一ID) ### 1.常用命令 ### <table> <thead> <tr> <th>命令</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>jps</td> <td>显示进程号和主类名</td> </tr> <tr> <td>jps -l</td> <td>显示进程号和主类全名</td> </tr> <tr> <td>jps -m</td> <td>输出执行主类main()函数的参数</td> </tr> <tr> <td>jps -v</td> <td>输出启动时JVM参数</td> </tr> </tbody> </table> ### 2.实战 ### 此处较为简单,不做详解,可自行实验 ## jinfo ## [官方链接][Link 1] 功能:实时查看和调整JVM各项参数 jps -v可以查看显式指定的参数,但要知道未被指定的参数默认值,需要用jinfo ### 1.常用命令参数 ### <table> <thead> <tr> <th>命令</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>-flag name</td> <td>输出指定的参数</td> </tr> <tr> <td>-flag [+|-] name</td> <td>开-关指定参数</td> </tr> <tr> <td>-flag name=value</td> <td>输出执行主类main()函数的参数</td> </tr> <tr> <td>-flags</td> <td>输出给JVM默认和命令行传递的参数</td> </tr> <tr> <td>-sysprops</td> <td>输出Java系统配置</td> </tr> </tbody> </table> ### 2.实战 ### 首先指定java程序,并设置参数 java -Xms10M -Xmx100M jvm.DeadLock 输出指定参数 > jinfo -flag MaxHeapSize 13301 -XX:MaxHeapSize=4294967296 > jinfo -flag InitialHeapSize 13301 -XX:InitialHeapSize=268435456 输出所有默认参数和设置的参数 > jinfo -flags 13757 Attaching to process ID 13757, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=104857600 -XX:MaxNewSize=34603008 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=3145728 -XX:OldSize=7340032 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line: -Xms10M -Xmx100M 开启关闭指定参数 某些机器不支持动态修改 > jinfo -flag -MaxHeapSize 13757 > jinfo -flag +MaxHeapSize 13757 动态修改指定参数 某些机器不支持动态修改 > jinfo -flag MaxHeapSize=20971520 13757 ## jmap ## [官方链接][Link 2] 监视进程运行中的jvm物理**内存的占用**情况 ### 1. 常用命令参数 ### <table> <thead> <tr> <th>命令</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>-dump:[live,]format=b,file=</td> <td>输出jvm的heap内容到文件,live可选,代表只输出活的对象到文件</td> </tr> <tr> <td>-finalizerinfo</td> <td>打印正等候回收的对象的信息</td> </tr> <tr> <td>-heap</td> <td>打印heap的概要信息,GC算法,heap的配置及内存</td> </tr> <tr> <td>-histo</td> <td>打印每个class的实例数目,内存占用,类全名信息</td> </tr> <tr> <td>-sysprops</td> <td>输出Java系统配置</td> </tr> </tbody> </table> ### 2. 实战 ### 转存dump文件。 dump文件可以用MAT等分析,关于如何分析,此处挖个坑,后续填补 jmap -dump:format=b,file=Downloads/dump.bin 13757 Dumping heap to /Users/xiaoran/Downloads/dump.bin ... Heap dump file created 打印等待回收对象 > jmap -finalizerinfo 13757 Attaching to process ID 13757, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 Number of objects pending for finalization: 0 (等待回收对象0个) 打印heap重要信息 > jmap -heap 13757 Attaching to process ID 13757, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 using thread-local object allocation. Parallel GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 104857600 (100.0MB) NewSize = 3145728 (3.0MB) MaxNewSize = 34603008 (33.0MB) OldSize = 7340032 (7.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 = 2097152 (2.0MB) used = 0 (0.0MB) free = 2097152 (2.0MB) 0.0% used From Space: capacity = 524288 (0.5MB) used = 0 (0.0MB) free = 524288 (0.5MB) 0.0% used To Space: capacity = 524288 (0.5MB) used = 0 (0.0MB) free = 524288 (0.5MB) 0.0% used PS Old Generation capacity = 7340032 (7.0MB) used = 450216 (0.42935943603515625MB) free = 6889816 (6.570640563964844MB) 6.133706229073661% used 929 interned Strings occupying 65848 bytes. 打印class信息 > jmap -histo 13757 num #instances #bytes class name ---------------------------------------------- 1: 1421 124632 [C 2: 701 80000 java.lang.Class 3: 810 36832 [Ljava.lang.Object; 4: 1408 33792 java.lang.String 5: 15 25912 [B 6: 185 10360 java.lang.invoke.MemberName 7: 273 8736 java.util.concurrent.ConcurrentHashMap$Node ## jhat ## dump文件分析工具,可用刚刚dump的文件 jhat /Users/xiaoran/Downloads/dump.bin 开启后,可通过http://127.0.0.1:7000/访问 ## jstack ## [官方链接][Link 3] 观察jvm中当前所有**线程的运行情况**和线程当前状态。程序崩溃或卡住是贼好用 ### 1. 常用命令参数 ### <table> <thead> <tr> <th>命令</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>-F</td> <td>正常请求不被响应,强制输出线程堆栈</td> </tr> <tr> <td>-l</td> <td>除堆栈外,锁的信息</td> </tr> <tr> <td>-m</td> <td>如调用本地方法,可显示c/c++堆栈</td> </tr> </tbody> </table> ### 2. 实战 ### 写了一个死锁的程序作为调试程序 强制输出线程堆栈 > jstack -F 13757 Attaching to process ID 13757, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 Deadlock Detection: Found one Java-level deadlock: ============================= "Thread-0": waiting to lock Monitor@0x00007f863f02aea8 (Object@0x00000007b9c08c00, a java/lang/Boolean), which is held by "Thread-1" "Thread-1": waiting to lock Monitor@0x00007f863f0286c8 (Object@0x00000007b9c08580, a java/lang/Boolean), which is held by "Thread-0" Found a total of 1 deadlock. Thread 18955: (state = BLOCKED) Thread 3843: (state = BLOCKED) Thread 43011: (state = BLOCKED) - jvm.DeadLock$2.run() @bci=63, line=57 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame) Thread 21763: (state = BLOCKED) - jvm.DeadLock$1.run() @bci=63, line=36 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame) Thread 18435: (state = BLOCKED) Thread 19715: (state = BLOCKED) - java.lang.Object.wait(long) @bci=0 (Interpreted frame) - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame) - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame) - java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame) Thread 19971: (state = BLOCKED) - java.lang.Object.wait(long) @bci=0 (Interpreted frame) - java.lang.Object.wait() @bci=2, line=502 (Interpreted frame) - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Interpreted frame) - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame) 输出堆栈信息和锁的信息 > jstack -l 13757 //此处省略若干,关注锁的信息 Found one Java-level deadlock: ============================= "Thread-1": waiting to lock monitor 0x00007f863f0286c8 (object 0x00000007b9c08580, a java.lang.Boolean), which is held by "Thread-0" "Thread-0": waiting to lock monitor 0x00007f863f02aea8 (object 0x00000007b9c08c00, a java.lang.Boolean), which is held by "Thread-1" Java stack information for the threads listed above: =================================================== "Thread-1": at jvm.DeadLock$2.run(DeadLock.java:57) - waiting to lock <0x00000007b9c08580> (a java.lang.Boolean) - locked <0x00000007b9c08c00> (a java.lang.Boolean) at java.lang.Thread.run(Thread.java:748) "Thread-0": at jvm.DeadLock$1.run(DeadLock.java:36) - waiting to lock <0x00000007b9c08c00> (a java.lang.Boolean) - locked <0x00000007b9c08580> (a java.lang.Boolean) at java.lang.Thread.run(Thread.java:748) Found 1 deadlock. ## jstat ## [官方链接][Link 4] 用于监控JVM各种运行状态信息,运行期间定位JVM性能问题的首选 命令格式: jstat -<option> <vmid> [<interval> <count>] jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 当监控时间不传入时,只记录当前一次的情况 ### 1.常用命令参数 ### <table> <thead> <tr> <th>命令</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>-gc</td> <td>监视堆状况:Eden,S0,S1,老年代,永久代(元空间),压缩类空间,YoungGC,FullGC,GC消耗总时间</td> </tr> <tr> <td>-gcutil</td> <td>与gc基本一致,关注点在百分比</td> </tr> <tr> <td>-gccause</td> <td>与gcutil一致,额外输出上一次GC产生的原因</td> </tr> </tbody> </table> ### 2.实战 ### 类加载统计: >jstat -class 2060 Loaded Bytes Unloaded Bytes Time 15756 17355.6 0 0.0 11.29 * Loaded:加载class的数量 * Bytes:所占用空间大小 * Unloaded:未加载数量 * Bytes:未加载占用空间 * Time:时间 编译统计 >jstat -compiler 9848 Compiled Failed Invalid Time FailedType FailedMethod 1135 0 0 0.96 0 * Compiled:编译数量。 * Failed:失败数量 * Invalid:不可用数量 * Time:时间 * FailedType:失败类型 * FailedMethod:失败的方法 垃圾回收统计 >jstat -gc 2060 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 20480.0 20480.0 0.0 13115.3 163840.0 113334.2 614400.0 436045.7 63872.0 61266.5 0.0 0.0 149 3.440 8 0.295 3.735 * S0C:第一个幸存区的大小 * S1C:第二个幸存区的大小 * S0U:第一个幸存区的使用大小 * S1U:第二个幸存区的使用大小 * EC:伊甸园区的大小 * EU:伊甸园区的使用大小 * OC:老年代大小 * OU:老年代使用大小 * MC:方法区大小 * MU:方法区使用大小 * CCSC:压缩类空间大小 * CCSU:压缩类空间使用大小 * YGC:年轻代垃圾回收次数 * YGCT:年轻代垃圾回收消耗时间 * FGC:Full GC垃圾回收次数 * FGCT:Full GC垃圾回收消耗时间 * GCT:垃圾回收消耗总时间 堆内存统计 >jstat -gccapacity 2060 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 204800.0 204800.0 204800.0 20480.0 20480.0 163840.0 614400.0 614400.0 614400.0 614400.0 0.0 63872.0 63872.0 0.0 0.0 0.0 149 8 * NGCMN:新生代最小容量 * NGCMX:新生代最大容量 * NGC:当前新生代容量 * S0C:第一个幸存区大小 * S1C:第二个幸存区的大小 * EC:伊甸园区的大小 * OGCMN:老年代最小容量 * OGCMX:老年代最大容量 * OGC:当前老年代大小 * OC:当前老年代大小 * MCMN:最小元数据容量 * MCMX:最大元数据容量 * MC:当前元数据空间大小 * CCSMN:最小压缩类空间大小 * CCSMX:最大压缩类空间大小 * CCSC:当前压缩类空间大小 * YGC:年轻代gc次数 * FGC:Full GC次数 新生代垃圾回收统计 >jstat -gcnew 9849 S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT 10752.0 10752.0 0.0 0.0 15 15 0.0 65536.0 10521.4 0 0.000 * S0C:第一个幸存区大小 * S1C:第二个幸存区的大小 * S0U:第一个幸存区的使用大小 * S1U:第二个幸存区的使用大小 * TT:对象在新生代存活的次数 * MTT:对象在新生代存活的最大次数 * DSS:期望的幸存区大小 * EC:伊甸园区的大小 * EU:伊甸园区的使用大小 * YGC:年轻代垃圾回收次数 * YGCT:年轻代垃圾回收消耗时间 新生代内存统计 >jstat -gcnewcapacity 9849 NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC 87040.0 1397760.0 87040.0 465920.0 10752.0 465920.0 10752.0 1396736.0 65536.0 0 0 * NGCMN:新生代最小容量 * NGCMX:新生代最大容量 * NGC:当前新生代容量 * S0CMX:最大幸存1区大小 * S0C:当前幸存1区大小 * S1CMX:最大幸存2区大小 * S1C:当前幸存2区大小 * ECMX:最大伊甸园区大小 * EC:当前伊甸园区大小 * YGC:年轻代垃圾回收次数 * FGC:Full GC回收次数 老年代垃圾回收统计 >jstat -gcold 9849 MC MU CCSC CCSU OC OU YGC FGC FGCT GCT 4480.0 774.6 384.0 75.9 175104.0 0.0 0 0 0.000 0.000 * MC:方法区大小 * MU:方法区使用大小 * CCSC:压缩类空间大小 * CCSU:压缩类空间使用大小 * OC:老年代大小 * OU:老年代使用大小 * YGC:年轻代垃圾回收次数 * FGC:Full GC次数 * FGCT:Full GC消耗时间 * GCT:垃圾回收消耗总时间 老年代内存统计 >jstat -gcoldcapacity 9849 OGCMN OGCMX OGC OC YGC FGC FGCT GCT 175104.0 2796544.0 175104.0 175104.0 0 0 0.000 0.000 * OGCMN:老年代最小容量 * OGCMX:老年代最大容量 * OGC:当前老年代大小 * OC:老年代大小 * YGC:年轻代垃圾回收次数 * FGC:Full GC次数 * FGCT:Full GC消耗时间 * GCT:垃圾回收消耗总时间 元数据空间统计 >jstat -gcmetacapacity 9849 MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT 0.0 1056768.0 4480.0 0.0 1048576.0 384.0 0 0 0.000 0.000 * MCMN:最小元数据容量 * MCMX:最大元数据容量 * MC:当前元数据空间大小 * CCSMN:最小压缩类空间大小 * CCSMX:最大压缩类空间大小 * CCSC:当前压缩类空间大小 * YGC:年轻代垃圾回收次数 * FGC:Full GC次数 * FGCT:Full GC消耗时间 * GCT:垃圾回收消耗总时间 总垃圾回收统计 >jstat -gcutil 9849 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 16.05 0.00 17.29 19.76 0 0.000 0 0.000 0.000 * S0:幸存1区当前使用比例 * S1:幸存2区当前使用比例 * E:伊甸园区使用比例 * O:老年代使用比例 * M:元数据区使用比例 * CCS:压缩使用比例 * YGC:年轻代垃圾回收次数 * FGC:Full GC次数 * FGCT:Full GC消耗时间 * GCT:垃圾回收消耗总时间 垃圾回收原因 >jstat -gccause 9849 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC 0.00 0.00 16.05 0.00 17.29 19.76 0 0.000 0 0.000 0.000 No GC No GC * S0:幸存1区当前使用比例 * S1:幸存2区当前使用比例 * E:伊甸园区使用比例 * O:老年代使用比例 * M:元数据区使用比例 * CCS:压缩使用比例 * YGC:年轻代垃圾回收次数 * FGC:Full GC次数 * FGCT:Full GC消耗时间 * GCT:垃圾回收消耗总时间 * LGCC:上一次回收原因 * GCC :当前GC的原因 [Link 1]: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html [Link 2]: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html [Link 3]: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html [Link 4]: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
还没有评论,来说两句吧...