【尊重原创文章出自:http://www.chepoo.com/java-jvm-command-tools.html】
一、概述 程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分析需要的数据,进而提高问题解决速度。 本文将介绍虚拟机常用监控和问题诊断命令工具的使用方法,主要包含以下工具: jps 显示系统中所有Hotspot虚拟机进程 jstat 收集Hotspot虚拟机各方面运行数据 jstack 显示虚拟机的线程栈信息 jinfo 显示虚拟机的配置信息 jmap 用于生成虚拟机的内存快照信息
以上工具的官方文档地址: http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/ 图形化工具如jconsole,jvisualvm将另文介绍。
二、工具介绍 1. jps JVM PRocess Status Tool,该命令用于列出正在运行的虚拟机进程,显示main类的名称和虚拟机进程id。该命令受当前用户的访问权限影响,比如linux下非root用户只列出当前用户启动的虚拟机进程。
命令格式: jps [options] [hostid]
执行示例:
1234 | $ jps -l 3733 sun.tools.jps.Jps 3700 com.leanworld.JVMTools com.leanworld.JVMTools即为上面的示例代码执行类。 |
常用参数: -l 输出主类全名 -v 输出虚拟机进程启动的jvm参数 -m 输出启动时传递给main函数的参数
2. jstat JVM Statistics Monitoring Tool,用于监控各种运行状态信息的命令。在只有文本控制台的环境中(如企业中的生产环境),该工具非常有用。 可以用来显示系统中类装载、垃圾回收、运行期编译状况等运行数据。
命令格式: jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] vmid表示虚拟机唯一标识符,如果是本地虚拟机进程,与LVMID一致,通常为本地虚拟机进程号。 interval表示查询间隔时间,count表示查询次数。如果省略interval和count参数,表示查询一次。
执行示例:
123456 | $ jstat -gcutil 3700 500 4 S0 S1 E O P YGC YGCT FGC FGCT GCT 50.00 0.00 60.78 0.50 12.76 214 0.049 0 0.000 0.049 0.00 25.00 20.27 0.50 12.76 215 0.049 0 0.000 0.049 0.00 25.00 70.91 0.50 12.76 215 0.049 0 0.000 0.049 50.00 0.00 20.27 0.50 12.76 216 0.049 0 0.000 0.049 |
S0和S1表示Survivor0和Survivor1,E表示新生代Eden,O表示老年代Old,P表示持久代Permanent,以上各参数值表示已使用空间占比。 YGC表示young gc次数,YGCT表示young gc总耗时。FGC表示Full gc次数,FGCT表示full gc总耗时。GCT表示所有gc总耗时时间。
常用参数: class 类装载相关信息. compiler JIT编译器编译过的方法、耗时等. gc java堆信息和垃圾回收状况. gccapacity 关注java堆各个区的最大和最小空间. gccause 类似gcutil,额外输出导致上一次gc的原因. gcnew 新生代gc状况. gcnewcapacity 关注新生代gc使用的最大和最小空间. gcold 老年代gc状况. gcoldcapacity 关注老年代gc使用的最大和最小空间. gcpermcapacity 关注持久代gc使用的最大和最小空间. gcutil 关注已使用空间占总空间比例. printcompilation 输出已经被JIT编译的方法.
3. jstack Stack Trace for Java,用于生成虚拟机当前的线程快照信息,包含每一条线程的堆栈信息。该命令通常用于定位线程停顿原因,当出现线程停顿时,可通过stack查看每个线程的堆栈信息,进而分析停顿原因。 命令格式: jstack [ option ] pid
执行示例:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | $ jstack 3700 2012-01-30 16:36:05 Full thread dump Java HotSpot(TM) Server VM (17.0-b16 mixed mode): "Attach Listener" daemon prio=10 tid=0xaca16c00 nid=0x1384 waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "Low Memory Detector" daemon prio=10 tid=0xaca00c00 nid=0x1366 runnable [0x00000000] java.lang.Thread.State: RUNNABLE "CompilerThread1" daemon prio=10 tid=0x08e58800 nid=0x1365 waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "CompilerThread0" daemon prio=10 tid=0x08e56800 nid=0x1364 waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x08e54c00 nid=0x1363 runnable [0x00000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=10 tid=0x08e39000 nid=0x1361 in Object.wait() [0xac943000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) "Reference Handler" daemon prio=10 tid=0x08e34400 nid=0x1360 in Object.wait() [0xacb94000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xb10e30d0> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:485) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - locked <0xb10e30d0> (a java.lang.ref.Reference$Lock) "main" prio=10 tid=0x08d7bc00 nid=0x135a waiting on condition [0xb6a8a000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.leanworld.JVMTools.createList(JVMTools.java:23) at com.leanworld.JVMTools.main(JVMTools.java:29) "VM Thread" prio=10 tid=0x08e31c00 nid=0x135f runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x08d83800 nid |