|
| 1 | +## JVM监控和诊断概述jps、jstak、jstack、jinfo、jmap ## |
| 2 | +程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分析需要的数据,进而提高问题解决速度。可以使用图形化工具如:jconsole,jvisualvm,或者命令进行监控和诊断命令。 本文将介绍虚拟机常用监控和问题诊断命令工具的使用方法,主要包含以下工具: |
| 3 | + |
| 4 | + jps 显示系统中所有Hotspot虚拟机进程 |
| 5 | + jstat 收集Hotspot虚拟机各方面运行数据 |
| 6 | + jstack 显示虚拟机的线程栈信息 |
| 7 | + jinfo 显示虚拟机的配置信息 |
| 8 | + jmap 用于生成虚拟机的内存快照信息 |
| 9 | + |
| 10 | +### 命令介绍 ### |
| 11 | + |
| 12 | +#### 1).jps 命令 #### |
| 13 | +JVM Process Status Tool,该命令用于列出正在运行的虚拟机进程,显示main类的名称和虚拟机进程id。该命令受当前用户的访问权限影响,比如linux下非root用户只列出当前用户启动的虚拟机进程。 |
| 14 | + |
| 15 | +命令格式: |
| 16 | + |
| 17 | + jps [options] [hostid] |
| 18 | + |
| 19 | + 常用参数: |
| 20 | + -l 输出主类全名 |
| 21 | + -v 输出虚拟机进程启动的jvm参数 |
| 22 | + -m 输出启动时传递给main函数的参数 |
| 23 | + |
| 24 | +#### 2).jstack 命令 #### |
| 25 | +Stack Trace for Java,用于生成虚拟机当前的线程快照信息,包含每一条线程的堆栈信息。该命令通常用于定位线程停顿原因,当出现线程停顿时,可通过stack查看每个线程的堆栈信息,进而分析停顿原因。 |
| 26 | + |
| 27 | +命令格式: |
| 28 | + jstack [ option ] pid |
| 29 | + |
| 30 | + 常用参数: |
| 31 | + -l 除堆栈外,显示锁的附加信息 |
| 32 | + -F 当请求不被响应时,强制输出线程堆栈 |
| 33 | + -m 混合模式,打印java和本地C++调用的堆栈信息 |
| 34 | + |
| 35 | +#### 3) jstat命令 #### |
| 36 | +JVM Statistics Monitoring Tool,用于监控各种运行状态信息的命令。在只有文本控制台的环境中(如企业中的生产环境),该工具非常有用。 可以用来显示系统中类装载、垃圾回收、运行期编译状况等运行数据。 |
| 37 | + |
| 38 | +命令格式: |
| 39 | + jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] |
| 40 | + vmid表示虚拟机唯一标识符,如果是本地虚拟机进程,与LVMID一致,通常为本地虚拟机进程号。 |
| 41 | + interval表示查询间隔时间,count表示查询次数。如果省略interval和count参数,表示查询一次。 |
| 42 | + |
| 43 | + 常用参数: |
| 44 | + class 类装载相关信息. |
| 45 | + compiler JIT编译器编译过的方法、耗时等. |
| 46 | + gc java堆信息和垃圾回收状况. |
| 47 | + gccapacity 关注java堆各个区的最大和最小空间. |
| 48 | + gccause 类似gcutil,额外输出导致上一次gc的原因. |
| 49 | + gcnew 新生代gc状况. |
| 50 | + gcnewcapacity 关注新生代gc使用的最大和最小空间. |
| 51 | + gcold 老年代gc状况. |
| 52 | + gcoldcapacity 关注老年代gc使用的最大和最小空间. |
| 53 | + gcpermcapacity 关注持久代gc使用的最大和最小空间. |
| 54 | + gcutil 关注已使用空间占总空间比例. |
| 55 | + printcompilation 输出已经被JIT编译的方法. |
| 56 | + |
| 57 | +#### 4) jinfo命令 #### |
| 58 | +Configuration Info for Java,用于查看和修改虚拟机的各项参数信息。 |
| 59 | + |
| 60 | +命令格式: |
| 61 | + |
| 62 | + jinfo [ option ] pid |
| 63 | + 常用参数: |
| 64 | + -flag name 打印虚拟机该参数对应的值. |
| 65 | + -flag [+\-]name 使该参数生效或失效. |
| 66 | + -flag name=value 修改相应参数的值. |
| 67 | + -flags 打印传给jvm的参数值. |
| 68 | + -sysprops 打印System.getProperties()信息. |
| 69 | + |
| 70 | +#### 5) jmap命令 #### |
| 71 | +Memory Map for Java,可以产生堆dump文件,查询堆和持久代的详细信息等。 |
| 72 | + |
| 73 | +命令格式: |
| 74 | + |
| 75 | + jmap [ option ] pid |
| 76 | + 常用参数: |
| 77 | + -dump 生成堆dump文件,格式为: -dump:[live,]format=b,file=<filename> |
| 78 | + -heap 显示java堆的详细信息,包括垃圾回收期、堆配置和分代信息等 |
| 79 | + -histo 显示堆中对象的统计信息,包括类名称,对应的实例数量和总容量 |
| 80 | + -permstat 统计持久代中各ClassLoader的统计信息。 |
| 81 | + |
| 82 | +#### 6) jhatk命令 #### |
| 83 | +Jvm Heap Analysis Tool, 与jmap一起使用 |
| 84 | + |
| 85 | +示例: |
| 86 | + |
| 87 | + jhat dump.tmp |
| 88 | + Reading from dump.tmp... |
| 89 | + Dump file created Tue Jun 28 13:55:09 CST 2016 |
| 90 | + |
0 commit comments