目前有许多分析JVM程序的工具,首先就是jdk本身提供的基本分析工具如jmap、jconsole、VisualVM等,此外还有一些第三方工具如基于eclipse的MAT。分析工具对于JVM程序优化有着举足轻重的作用。

jdk提供的工具

以下内容参考周志明老师著述:《深入理解Java虚拟机》第二版。

首先来看下基于文本的JVM相关工具:

java 监控linux 文件 linux jvm监控工具_JVM


其实现在已经有许多更好的工具作为替代,但在linux的命令行控制界面下还是会比较多的用到上述工具。

如下对几个个人认为重要的工具进行展开copy

1 Jps

可能在linux下开发时用的比较多就是jps了,其对应有如下参数:

java 监控linux 文件 linux jvm监控工具_java 监控linux 文件_02


2 Jstat

其可以监控JVM运行时状态信息,比如说GC情况,详细参数用法如下:

java 监控linux 文件 linux jvm监控工具_jmap_03

案例:在此假设每个1000毫秒查询已使用空间占用百分比,一共查询20次:

jstat -gcutil 12444 1000 20

java 监控linux 文件 linux jvm监控工具_jmap_04


3 Jmap

用于生成堆转储快照文件的工具,主要用法如下:

jmap [option] vmid

java 监控linux 文件 linux jvm监控工具_MAT_05


如在此生成sts(pid=12444)的运行dump文件并将其存放在E:\jmap文件夹下 :

jmap -dump:format=b,file=E:\jmap\eclipse.bin 12444

4 Jstack

可用于定位线程长时间停顿问题,如死锁、外部资源请求、死循环等。通过jstack查看各个线程堆栈调用情况即可知道线程在后台的工作情况,以此进行问题定位。详细用法参数如下:

java 监控linux 文件 linux jvm监控工具_JVM_06

除了上述几个基于文本的分析工具外,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

堆内存监控

java 监控linux 文件 linux jvm监控工具_jconsole_07

线程监控:如下可以很清楚的查看线程运行状态及其他相关信息。当检测到死锁时会自动在左栏显示。

java 监控linux 文件 linux jvm监控工具_jconsole_08


6 VisualVM

在自己本机JAVA_HOME/bin(Java8)目录下找到jvisualvm.exe直接点击运行既可以选择对相应进程进行监控,如下:

对heapdump文件进行分析:

java 监控linux 文件 linux jvm监控工具_jmap_09


基本信息监控

java 监控linux 文件 linux jvm监控工具_java 监控linux 文件_10


以上关于jdk基本工具的操作这位大佬的文章写的还是挺详细的

第三方分析工具
除了上述jdk提供的工具外,业界前辈们还开发出了许多功能强大、可视化更加友好的JVM监控分析工具。
比如MAT(Memory Analyzer Tool):一款基于eclipse的插件工具,简单易用且友好的可视化界面。可利用jmap工具生成堆转储快照文件,而后将文件直接拖入eclipse项目目录下点击即可进行分析(在已安装MAT的情况下)。

java 监控linux 文件 linux jvm监控工具_jconsole_11


java 监控linux 文件 linux jvm监控工具_jmap_12


java 监控linux 文件 linux jvm监控工具_jmap_13