JVM 监控工具html
官方手册:https://docs.oracle.com/javase/8/docs/technotes/tools/index.htmljava
功能: 列出正在运行的虚拟机并显示虚拟机执行主类名称web
主要参数:apache
-q: 只显示进程ID
-m: 显示传递给main方法的参数
-l: 显示应用程序mian方法名称或jar文件的路径名
-v: 显示传递给JVM虚拟机的参数ubuntu
实例:浏览器
$ jps 16420 Bootstrap 32375 Jps
$ jps -v 16420 Bootstrap -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp 32333 Jps -Denv.class.path=.:/home/ubuntu/software/jdk/jdk1.8.0_151/lib:/home/ubuntu/software/jdk/jdk1.8.0_151/jre/lib -Dapplication.home=/home/ubuntu/software/jdk/jdk1.8.0_151 -Xms8m
功能: 监视虚拟机各类运行状态信息,能够显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据tomcat
命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
bash
选项 | 做用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所消耗的时间 |
-compiler | 输出JIT编译器编译过的方法和、耗时 |
-gc | 监视Java堆情况 |
-gccapacity | 监视内容与-gc基本相同,主要关注java堆各个区域使用到的最大、最小空间 |
-gccause | 与-gcutil功能相同,灰额外输出致使上一次GC产生的缘由 |
-gcmetacapacity | 监视元空间 |
-gcnew | 监视新生代GC状况 |
-gcnewcapacity | 监视内容与-gcnew相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC状况 |
-gcoldcapacity | 监视内容与-gcold相同,输出主要关注使用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,主要关注已使用空间占总空间的百分比 |
-printcompilation | 输出已经被JIT编译的方法 |
$ jstat -class 16420 # 加载的类数 大小(Kb) 卸载的类数 大小(Kb) 执行类加载和卸载操做花费的时间 Loaded Bytes Unloaded Bytes Time 15096 30199.4 3 4.6 15.34
$ jstat -gc 16420 # 单位是KB # survivor0容量 survivor1容量 survivor0使用 survivor1使用 Eden容量 Eden使用 OLD容量 OLD使用 元空间容量 元空间使用 压缩类空间容量 压缩类空间使用 年轻代GC数量 年轻代GC时间 Full GC数量 Full GC时间 GC总时间 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 29696.0 28160.0 560.5 0.0 1339904.0 124539.0 2796544.0 144642.9 99072.0 89527.5 12544.0 10189.7 42 0.550 5 0.566 1.116
$ jstat -gccapacity 16420 # 最小新生代容量 最大新生代容量 当前新生代容量 survivor0容量 survivor1容量 Eden容量 最小老年代容量 最大老年代容量 当前老年代容量 老年代空间容量 最小元空间容量 最大元空间容量 元空间大小 最小压缩类空间容量 最大压缩类空间容量 压缩类空间容量 年轻代GC数量 FUll GC数量 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 1397760.0 1397760.0 1397760.0 29696.0 28160.0 1339904.0 2796544.0 2796544.0 2796544.0 2796544.0 0.0 1136640.0 99072.0 0.0 1048576.0 12544.0 42 5
关于OGC和GC的区别:https://stackoverflow.com/questions/11253285/jstat-difference-between-ogc-oc-pgc-pc
OGC = sum(all OC),可是HotShot中old space只有一个服务器
$ jstat -gcutil 16420 # Survivor0使用比 Survivor0使用比 Eden使用比 OLD使用比 元空间使用比 压缩类使用比 年轻代GC数量 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1.89 0.00 16.46 5.17 90.37 81.23 42 0.550 5 0.566 1.116
# jstat -gccause 16420 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC 1.89 0.00 17.20 5.17 90.37 81.23 42 0.550 5 0.566 1.116 Allocation Failure No GC
隔2秒监控一次堆使用状况,监测5次websocket
$ jstat -gcutil 16420 2000 5 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
功能:实施查看和调整虚拟机参数
命令格式
jinfo [option] <pid> 参数: -flag <name> 打印虚拟机参数的值 -flag [+|-]<name> 启用或关闭虚拟机参数 -flag <name>=<value> 设置虚拟机参数 -flags 打印虚拟机参数
$ jinfo -flag InitialHeapSize 16420 -XX:InitialHeapSize=4294967296
jinfo -flags 16420 Attaching to process ID 16420, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=4294967296 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1431306240 -XX:OldSize=2863661056 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line: -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp
功能: 生成堆转储快照,查询finalize执行队列、Java堆详细信息、当前使用的那种收集器
主要选择
选择 | 做用
---|---
-heap | 显示java堆信息,如使用哪一种回收器、参数配置、分代状况
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量
-dump | 生成java堆转储快照
-clstats | 打印Java堆的类加载器的统计信息。对于每一个类加载器,它的名称,它的活动程度,地址,父类加载器以及它加载的类的数量和大小都会被打印出来。
-finalizerinfo | 打印有关正在等待最终肯定的对象的信息
-F | 当虚拟机进程没有响应时强制生成dump快照
# 须以root用户执行 $ jmap -J-d64 -heap 16420 Attaching to process ID 16420, 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 = 4294967296 (4096.0MB) NewSize = 1431306240 (1365.0MB) MaxNewSize = 1431306240 (1365.0MB) OldSize = 2863661056 (2731.0MB) NewRatio = 2 # 老年代占据堆的2/3,新生代占据1/3 SurvivorRatio = 8 # Survivor:Eden=1:8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: # Eden区内存分布 capacity = 1378353152 (1314.5MB) used = 74006280 (70.57788848876953MB) free = 1304346872 (1243.9221115112305MB) 5.36918132284287% used From Space: # 其中一个Survivor区的内存分布 capacity = 27262976 (26.0MB) used = 0 (0.0MB) free = 27262976 (26.0MB) 0.0% used To Space: # 另外一个Survivor区的内存分布 capacity = 25690112 (24.5MB) used = 0 (0.0MB) free = 25690112 (24.5MB) 0.0% used PS Old Generation capacity = 2863661056 (2731.0MB) used = 60243072 (57.4522705078125MB) free = 2803417984 (2673.5477294921875MB) 2.1037081841015195% used 38423 interned Strings occupying 4154104 bytes.
# 须以jvm启动用户执行该命令 $ jmap -histo:live 16420 num #instances #bytes class name ---------------------------------------------- 1: 187022 22144672 [C 2: 185124 4442976 java.lang.String 3: 85170 2725440 java.util.HashMap$Node 4: 29978 2638064 java.lang.reflect.Method 5: 40422 2440632 [Ljava.lang.Object; 6: 6915 2123840 [B 7: 15533 1718560 java.lang.Class ... ... .... ... 6186: 1 16 sun.util.resources.LocaleData 6187: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl 6188: 1 16 websocket.drawboard.DrawboardContextListener Total 1186181 62814680
$ jmap -dump:live,format=b,file=jenkins.bin 16420 Dumping heap to /home/jenkins/jenkins.bin ... $ ll jenkins.bin -h -rw------- 1 jenkins jenkins 1011M 2月 14 11:43 jenkins.bin
功能:分析jamp生成的堆转储快照,jhat内置了一个微型HTTP服务器,生成dump文件的分析结果后能够在浏览器查看。
通常不会在生产服务器上进行分析,很是耗CPU和内存,不经常使用
jhat jenkins.bin Reading from jenkins.bin... Dump file created Thu Feb 14 11:43:45 CST 2019 Snapshot read, resolving... Resolving 12022774 objects... Chasing references, expect 2404 dots Eliminating duplicate references Snapshot resolved. Started HTTP server on port 7000 Server is ready.
使用浏览器访问http://ip:7000 查看分析结果
功能: 生成虚拟机当前时刻的线程快照(通常称为threaddump、javacore文件)
参数:
-l: 打印关于锁的信息
-m: 打印java和native frames 的信息
$ jstack -l 16420 > jenkins.jstack
线程的几种状态: 状态 | 含义 ---|--- NEW|未启动的,不会出如今dump中 RUNNABLE|在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表面它得到了某把锁 BLOCKED|受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。 WATING|无限期等待另外一个线程执行特定操做。等待某个condition或monitor发生,通常停留在park(), wait(), sleep(),join() 等语句里。 TIMED_WATING|有时限的等待另外一个线程的特定操做。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。 TERMINATED|已退出的。