前置:
RMI协议:java的一个远程调用协议,在不同的JVM之间可以进行接口的调用,但数据不安全,且仅限java;
一、常见命令及用法
1、jps:与Linux的ps命令有点类似,查看系统中在运行的Java程序,并打印main方法所在类名和PID进程号;主要选项参数:
-m:输出启动时传递给main函数的参数
-v:输出启动时JVM的参数
2、jstat:监视运行中的JVM状态信息,包含类加载的信息,内存、垃圾回收、即时编译信息(当使用动态代理时,会在运行过程中实时的产生Class对象);
可以查看本地的,也可以通过RMI协议查看远程的;
在运行中的JVM,没有可视化图形工具的时候常用;
命令格式:
本地:jstat option interval count
如:jstat -gc 1027 1000 10 表示打印1027那个进程的垃圾回收信息,每1000毫秒打印一次,总共打印10次,省略interval和count表示只打印一次;只省略count表示在间隔时间内一直打印,interval的单位是毫秒;
远程:jstat option 协议RMI://lvmid @远程机器的hostname:端口/servername
如:jstat -gc RMI://1027@192.168.1.1:8080/HelloJVM
主要选项参数:主要包含三大类:类加载、垃圾回收和即时编译情况
-gc:表示打印gc信息
-class:表示打印类加载和卸载,空间和耗时等信息
-gccause:导致上一次GC的原因
-compiler:即时编译过的方法、耗时等;
3、jmap:生成堆转储文件(heapdump或dump文件)
备注:生成堆转储快照也可以通过设置参数的方式进行,比如设置
+XX:HeapDumpOnOutOfMemaryError:在出现内存溢出异常的时候在当前工程目录下,生成堆转储快照,这种是比较暴力的做法,一般在生产环境上不用,因为生成快照是比较耗时的,会影响系统整个运行,一般在测试环境或者压力测试的时候用;
也可以通过+XX:HeapDumPath=path来指定生成堆文件的路径
jmap生成堆转储快照:
jmap -dump pid
jmap -heap pid:生成堆详细信息,比如垃圾回收器,参数配置等,但只在Linux下有限,Windows下无效;
jmap -F:当已经发生内存溢出,同时使用jmap -dump无响应时,使用-F强制生成堆文件
jmap -histo:统计对象信息,包括类、实例数量等,可以查看哪个对象分配最多导致内存溢出;
4、jstack:生成当前时刻JVM的线程快照,线程快照是指每一条线程正在执行的那个方法的堆栈信息;当某个线程出现长时间卡顿时,需要使用该命令进行定位,比如出现请求外部资源未响应导致一直等待,死循环,深度递归调用,死锁等;
格式:jstack option pid
jstack -F:强制生成线程快照信息
jstack -l:显示锁的附加信息;
5、jhat:与jmap配合使用,在JVM内部内置了一个微型的web服务器,用来分析jmap转储的堆文件快照,除非在完全依赖线上的环境上,否则一般不使用jhat来分析堆文件,因为功能相对简陋,且加载堆文件比dump堆文件更耗内存,可以下载到本地使用VisualVM可视化工具进行分析;
6、jinfo:查看JVM的一些显示指定和非显示指定的参数,也可以对这些参数进行修改
jinfo -flag:查询默认的那些参数值
二、JDK自带可视化工具
1、JConsole
2、VisualVM:
对JVM实际性能影响较小,相比于其他可视化工具,它可以使用在生产环境中排查问题;
支持插件安装,可以扩展功能;
3、Mission Control
三、其他第三方可视化工具
1、阿里的Arthas