自学内容网 自学内容网

JVM常见排查问题的命令及可视化工具

前置:

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


原文地址:https://blog.csdn.net/weixin_41992498/article/details/144826984

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!