JVM在运行过程中,我们可以利用各种工具对JVM进行分析,这是性能调优的利器。可以通过各种工具了解在系统运行过程中,在JVM底层到底发生了什么。JVM分析工具一般分为两种,一种是命令行工具,一种是图形界面工具。
JVM分析工具
JDK自带的命令行工具都在jdk的bin目录下(C:\Program Files\Java\jdk1.8.0_291\bin)。内置的命令行工具可以帮助我们系统运行过程中JVM内部的运行过程。主要的工具有如下
- java:java应用的启动程序,如java -jar xx.jar
- javac:jdk内置的编译工具,将java源文件编译为.class文件。如javac xx.java
- javap:反编译class文件工具,如javap -verbose xx.class
- javadoc:根据java代码和标准注释,自动生成相关的API说明文档
- javah:JNI开发时,根据java代码生成需要的.h文件
- extcheck:检查某个jar文件和运行时扩展jar有没有版本冲突,一般使用比较少
- jdb:Java Debugger,可以调试本地和远端程序,属于JPDA中的一个demo实现,供其他调试器参考。开始很少使用
- jar:打包工具,可以将文件和目录打包成.jar文件,jar文件从本质上来讲就是zip文件,只是后缀不同。
- keytool:安全证书和密钥的管理工具
- jarsigner:JAR文件签名和验证工具
- policytool:是一款图形界面工具,管理本机的Java安全策略
- jps/jino:查看运行中的java进程
- jstat:查看JVM内部gc相关信息
- jmap:查看线程信息
- jcmd:执行JVM相关分析命令(整合命令)
- jrunscript/jjs:执行js命令
命令行指令具体用法在csdn上有大量文章可以参考,以下会列出几个比较常用的指令作为参考。
1 jps/jino命令
-
jps指令可以列出操作系统上正在运行的java进程
-
jps -l 指令可以列出操作系统上正在运行的java进程,可以输出主类或jar路径
-
jps -mlvV指令可以输出更详细信息,包括系统参数等
2 jstat指令
可以通过jstat -options查看jstat可以支持的参数类型
如采样100次,每次间隔100ms
jstat -gcutil pid 100 100
3 jmap指令
jmap指令可以查看堆内存占用的一些情况
如jmap -histo 33824,查看33824进程的堆占用情况
4 jstack指令
jstack属于线程堆栈分析工具
如jstack -l 33824,查看进程33824的堆栈信息
5 jcmd指令
jcmd可以理解成前面所有命令的集合。这个指令用的比较多,如果不记得jcmd可以支持哪些参数,可以输入jcmd pid help指令
6 jrunscript/jjs指令
jjs指令是java命令行脚本执行工具,可以解释字形javascript脚本
2 JVM图形化分析工具
命令行分析工具虽然能给JVM分析提供方便,但没有图形界面交互风格友好。目前,JVM提供以下几种图形化界面工具可以给开发者分析JVM运行分析。
1 jconsole工具
直接在命令界面,输入jconsole命令即可启动jconsole工具(windows系统是在”运行“框输入”cmd”,弹出小黑框再输入“jconsole”即可)。jconsole聚焦于监控JVM内存、线程、CPU等使用情况及发展趋势。
2 jvisualvm
jdk8大概从26开始,jvisualvm都没有被直接打包进jdk,所以直接通过jvisualvm命令,不会打开jvisualvm。可以去官网直接下载jvisualvm工具,下载之后再使用。
下载地址
为:visualvm.github.io。jvisualvm比较核心的是CPU抽样器。
也可以直接点击如下链接
进行资源下载
jvisualvm包下载路径:
jvisualvm资源包
3 jmc
jmc功能非常强大,不仅包括jconsole及jvisualvm功能,还有一个飞行记录的能力,把一段时间段内,JVM的变化记录下来,从而对jvm内部各种状态进行分析(包括内存、cpu)。
从2020年7月以后,jmc就已经不再打包到jdk,jdk默认不带jmc,所以需要手工下载。
jmc包下载和使用教程
可以参考
jmc包和部署教程