安装好jdk后,进入JAVA_HOME/bin目录,可以看到该目录下有一些可供我们使用的工具,这些工具在遇到问题的时候可以很好的帮助我们排查。
1.jconsole
jconsole是一个可视化的工具,可以以图形化的方式向你展示java进程的各项数据,比如内存的占用和GC、线程数线程池、类的载入数量以及VM的摘要等,功能强大,如图:
jconsole可以连接远程主机,前提是目标主机进行了相关设置,比如启动参数
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
表示允许匿名通过1099端口连接该进程获取相关的数据。
2.jvisualvm
jvisualvm可以看作一个加强版的jconsole,除了jconsole提供的一些信息的查看,还可以对cpu内存进行取样分析,也可以dump出堆数据进行分析,另外支持一些其他的插件。
3.jps(JVM Process Status)
jps可以查看当前用户java进程的pid(如果想显示其他用户的java进程得用系统的ps命令),基本后面所有的命令都会用到pid。
$ jps
17113 Bootstrap
30207 Bootstrap
28573 Jps
27095 jar
在不加任何参数的情况下显示的是Main方法的文件名,参数 -l 显示具体的包名
$ jps -l
17113 org.apache.catalina.startup.Bootstrap
30362 sun.tools.jps.Jps
30207 org.apache.catalina.startup.Bootstrap
27095 slave.jar
此时如果同时启动两个tomcat(如上)可能还是没办法区分是哪个应用,参数 -v 显示jvm启动时带的参数,参数 -m 显示main方法的启动参数。
4.jinfo(JVM Configuration Info)
jinfo可以查看和设置JVM的参数,这个功能在动态修改JVM的参数场景下比较有用,不用重启应用服务器即可生效,当然如果设置参数值时报错:java.io.IOException: Command failed in target VM,说明该参数不支持修改。
查看比较简单,用法是jinfo -** pid
5.jmap(JVM Memory Map)
jmap用来打印java进程内存里面对象的使用情况,jmap -heap pid显示jvm堆的使用摘要,jmap -histo pid打印class的实例数目、内存占用、包含包路径的类名等信息(-histo:live时只统计活的对象)
该命令用得最多的是-dump参数,jmap -dump:format=b,file=filepath pid,使用hprof二进制形式dump jvm的堆内容到指定的文件,可用于后续的内存分析排查内存泄露等信息,-dump:live时只导出活的对象。
6.jstack(JVM Stack Trace)
jstack可以打印java进程的堆栈信息,jstack -l pid打印锁的一些附加信息,在排查死锁的时候比较有用。
7.jstat(JVM Statistics Monitoring Tool)
jstat用来对JVM堆的使用情况进行实时的统计,可以监控如下信息:
类的加载及卸载情况;
新生代、老生代及持久代的容量、使用情况和垃圾收集情况,并包含垃圾回收的次数及垃圾回收所耗费的时间;
新生代中s0及s1容量和分配情况。
jstat -options可以查看它支持的参数,用得比较多的有
$ jstat -gcutil 29784
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 99.46 76.34 49.36 31.06 30139 846.957 145 447.050 1294.007
输出分别代表s0使用百分比,s1使用百分比,新生代使用百分比,旧生代使用百分比,永久代使用百分比,自jvm启动后young gc的次数,耗费的时间,full gc的次数,耗费的时间,gc总的耗费时间(单位秒)。
还有-gc和-gccapacity也是较常用的参数。
8.jhat(JVM Heap Analyse Tool)
jhat用来分析dump出来堆里面的数据,可以将解析的数据以html的方式呈现。如果dump出来的堆很大可以加参数jhat -J-Xmx1024m jmapDumpFile解决堆内存不足的报错。
当然现在一般可以把dump文件下载到本地,用MAT(Memory Analyzer Tool)这种图形化工具来分析,速度比较快,而且图形化的结果可读性会更强。