无论对于开发人员还是运维人员,给一个系统定位问题时,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。对于开发人员或运维人员,这里的数据包括:运行日志、异常日志、GC日志、堆转储快照等。适当的使用这些工具,会使我们能够快速定位问题,提升解决问题的速度。
针对JAVA程序员来说,我们这里所讲的了解使用JDK命令行工具监控虚拟机的性能,定位系统问题。
JDK命令行工具,则是指JAVA_HOME\bin下的*.exe文件。除了常用的javac和java命令,还有很多我们曾未了解以及使用的命令,JDK更新版本时,bin目录下命令行工具的数量和功能则在不知不觉中增多和增强。JDK1.6中bin内容:【并非全部,太多不完全截图了】
我们再看看JDK1.7中的bin内容【并非全部,太多不完全截图了】
大家有没有发现,这些exe工具的大小,一般很小,差不多十几K,其实,这些JDK\bin下的工具真正的实现是在JDK\lib\tool.jar中。打开tool.jar,其中sun\tools目录:【JDK1.7.0_65】
注:版本不同,也许里面的内容也不同,大部分的工具在JDK1.5已经提供,在此,通过JDK1.6,以及JDK1.7给大家展示JDK命令行工具。
声明:以下工具都是在Win7、JDK1.7.0_65(32位)基础上操作的。
JDK\bin下分为很多工具,具体的汇总分类: http://docs.oracle.com/javase/7/docs/technotes/tools/
在此只介绍重要的虚拟机监控以及故障处理工具。
解释:列出正在运行的虚拟机进程,并且可以显示虚拟机执行的朱磊名称以及虚拟机的唯一ID(LVMID,Local Virtual Machine Identififer)
时机:当监控某一个虚拟机时,比如使用jconsole,jvisualvm(下文会介绍),需要知道虚拟机ID。
其中参数意义:
-q:只输出LVMID,省略主类的名称
-m:输出虚拟机进程启动时传递给主类main()函数的参数
-l:输出主类的全名,如果进程执行的是jar包,输出jar路径
-v:输出虚拟机进程启动时JVM参数
启动tomca7,tomcat6,虚拟机进程如下:
这样就可以看出,两个jvm进程,到底具体位置了,以及其中的启动参数,根据参数可知,7800进程初始化堆大小8m,7608进程是新安装的tomcat7,为了测试并没有设置初始化参数,所以通过jps看不出其初始化参数。7108进程tomcat6的,初始化堆和最大堆大小都是1G。
解释:jvm statistics monitoring tool,用于监视虚拟机各种运行状态,可以显示本地或远程虚拟机进程中的内存信息、垃圾收集信息、类装载信息、JTT编译数据。唯一不足之处,在于他没有界面,只是纯文本形式。
时机:通过jpl获取需要监控的虚拟机ID,然后通过jstat来查看虚拟机运行状态,及时定位以及解决问题。
用途:jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
参数讲解:jstat的option分为两部分,generalOption一般选项和outputOption输出选项,一般选项则是-help or -option;而outputOptions则包括统计信息;vmid:虚拟机I的,interval:间隔、count:查询次数。
若是远程jvm,则VMID的格式则:[protocol:][//]lvmid[@hostname[:port]/servername]
对于outputOption
部分参数如下:
上图中的S、E等字母,在此简单介绍一下,后面讲GC算法会具体介绍,其中S0、S1是指幸运区0、1;E是指伊甸区,这三区则称为新生代;O代表老年区。P代表持久区;YGC新生代GC次数,YGCT新生代时间。FGC:老年代GC次数,老年代GC时间。GCT总共的GC时间。
jstat官网: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
Troubleshooting Tools
解释:Configuration Info for Java,实时查看和调整虚拟机的各项参数。
若你是64位vm,则需要指定 -J-d64参数【这个没测,本机是32位】
声明:没有截完整,其中jps-v没有显示出的参数,通过jinfo可以查看完整信息。
jinfo官网: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jinfo.html
解释:Memory Map for Java 用于生成堆转储快照(heapdump或dump文件),若不通过jmap,还可以通过暴力手段-XX:+HeapDumpOnOutOfMemoryError参数,后面专门有博客来讲解dump文件。
时机:除了生成dump文件,还可以查询内存详细信息,如空间使用率、当前使用那种收集器等。
格式:jmap [option] vmid
option如下:
jmap官网: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html
解释:JVM Heap Analysis Tool,与jmap相辅相成,jmap生成dump文件,jhat分析dum文件。jhat具体分析结果,下篇博客与jmap并讲。
jhat官网: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jhat.html
解释:Stack Trace for Java,生成虚拟机当前时刻的线程快照threaddump或javacore文件。
目的:定位线程长时间停顿原因。
C:\Users\..>jstack
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
jstack官网: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstack.html
上文只是常用的以及其重要用途,若想对每个了解更深,可以去官网针仔细看,上文已经给出每个命令的连接,方便大家进一步深造。
上文提到的jmap以及jhat,还有未曾提到可视化分析工具jconsole、jvisualvm,我们下篇会根据示例讲解。