目前有许多分析JVM程序的工具,首先就是jdk本身提供的基本分析工具如jmap、jconsole、VisualVM等,此外还有一些第三方工具如基于eclipse的MAT。分析工具对于JVM程序优化有着举足轻重的作用。
jdk提供的工具
以下内容参考周志明老师著述:《深入理解Java虚拟机》第二版。
首先来看下基于文本的JVM相关工具:
其实现在已经有许多更好的工具作为替代,但在linux的命令行控制界面下还是会比较多的用到上述工具。
如下对几个个人认为重要的工具进行展开copy
1 Jps
可能在linux下开发时用的比较多就是jps了,其对应有如下参数:
2 Jstat
其可以监控JVM运行时状态信息,比如说GC情况,详细参数用法如下:
案例:在此假设每个1000毫秒查询已使用空间占用百分比,一共查询20次:
jstat -gcutil 12444 1000 20
3 Jmap
用于生成堆转储快照文件的工具,主要用法如下:
jmap [option] vmid
如在此生成sts(pid=12444)的运行dump文件并将其存放在E:\jmap文件夹下 :
jmap -dump:format=b,file=E:\jmap\eclipse.bin 12444
4 Jstack
可用于定位线程长时间停顿问题,如死锁、外部资源请求、死循环等。通过jstack查看各个线程堆栈调用情况即可知道线程在后台的工作情况,以此进行问题定位。详细用法参数如下:
除了上述几个基于文本的分析工具外,jdk还提供了两个可视化工具:jconsole、VisualVM。
两款工具皆作为jdk的正式成员。
5 jconsole
先来看看jconsole,直接在控制台敲入jconsole pid或打开jconsole进行远程连接JVM进程即可监控对应进程的状态信息,包括JVM内存使用情况、GC相关信息、线程实例等。
如果监控远程服务需要在tomcat启动脚本中添加如下代码:
-Dcom.sun.management.jmxremote.port=6969
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
堆内存监控
线程监控:如下可以很清楚的查看线程运行状态及其他相关信息。当检测到死锁时会自动在左栏显示。
6 VisualVM
在自己本机JAVA_HOME/bin(Java8)目录下找到jvisualvm.exe直接点击运行既可以选择对相应进程进行监控,如下:
对heapdump文件进行分析:
基本信息监控
以上关于jdk基本工具的操作这位大佬的文章写的还是挺详细的
第三方分析工具
除了上述jdk提供的工具外,业界前辈们还开发出了许多功能强大、可视化更加友好的JVM监控分析工具。
比如MAT(Memory Analyzer Tool):一款基于eclipse的插件工具,简单易用且友好的可视化界面。可利用jmap工具生成堆转储快照文件,而后将文件直接拖入eclipse项目目录下点击即可进行分析(在已安装MAT的情况下)。