JVM性能监控工具<深入了解JVM读书笔记>

目录

前言

了解了部分JVM运行的原理之后,就要进入实战环节啦.在实际工作中,我们既不需要去实现虚拟机,也不需要对垃圾收集或者内存分配过程进行DEBUG.但是我们经常需要对某个应用程序进行JVM层面的调优.

可能是因为我们的代码和JVM配合不够好,也可能是我们的代码直接就有问题,但是需要在JVM上找到错误的具体表现.

这时候需要对很多数据进行查看和处理,比如程序运行日志,GC日志,堆转储文件等等,为了更快更方便的理解这些信息,我们需要借助一些工具.这篇文章大概讲一下工具的使用.

工具包括JDK自带的命令行工具(重点),以及几个可视化分析工具,因为可视化的使用起来比较简单,所以可视化工具介绍的简单一点.

JDK自带的命令行工具

JDK中自带了几个查看虚拟机运行状况的命令,包括jps,jinfo,jhat,jstat,jstack,jmap等.我们逐一看一下他们的作用.

jps

jps的功能比较简单,可以列出正在运行中的虚拟机,并且列出主类以及对应的进程ID.

虽然功能比较简单,但是却是最常用的一个命令,因为其他命令基本上依赖于此命令查询到的进程ID.

jstat

jstat是查看虚拟机各种运行状态信息的一个命令.它可以查看虚拟机中类加载,内存,GC,JIT编译等信息.在只有文本终端的服务器上,它是我们分析虚拟机运行情况的首选工具.

jstat的命令格式为:jatat option vmid interval count.

其中:

option: 选择相应查看的虚拟机信息.可选的参数有下表中的:

2019-08-15-11-34-17.

vimid: 想要查看的虚拟机进程ID.

interval: 查询间隔.

count: 总查询次数.

例如我们想要查看一个虚拟机的gc信息,每个1s查看一次,共查看10次.可以使用如下的命令.

2019-08-15-11-40-31

其中s0,s1表示两个survivor的使用比例,E=Eden区使用了77.43%. O=老年代使用了0.58%. M=方法区使用了98%. 后面的分别表示YoungGC的次数和总占用时间,以及FullGc的次数以及总占用时间.以及所有GC的占用时间.

jinfo

jinfo的作用是实施的查看和调整虚拟机的各个参数.

可以使用jinfo -flags pid来查看所有的已配置参数. 也可以使用单独的参数名称进行查询.

jmap

jmap用来生成堆转储快照以及查看java堆以及永久代的详细信息.命令格式为: jmap [option] pid.

2019-08-16-11-48-01

在下图中,我们可以拿到类以及他的实例数据:

2019-08-16-11-51-00

下图中可以看到堆中各个区域的使用量:

2019-08-16-11-53-07

jhat

jhat用于分析jmap生成的堆转储文件,但是一般不推荐使用,当需要分析堆转储文件的时候,我们一般会copy到本地进行,那时候有更强大的工具.

jstack

jstack用于生成当前虚拟机的线程快照. 线程快照是当前虚拟机内每一条线程正在执行方法的堆栈的集合.

我们可以根据线程快照分析线程停顿的原因,如分析死锁.死循环等等.

命令格式:jstack [option] pid.

由于线程的堆栈太多,我们这里打出前20行可以看到一个堆栈:

2019-08-16-11-58-53

可以看到当前线程正在等待,且没有锁.

此外,在1.5之后,Thread类中添加了getAllStackTraces方法,我们可以用这个方法来实现类似于jstack的功能.所以在项目中我们可以用简单的几十行代码实现一个管理员界面来跟踪线程堆栈.

JDK的可视化工具

在本地启动JVM,可以在JDK/bin目录下启动jconsole,或者VisualVM.可以打开图形界面,按照其中的引导,连接虚拟机,点击内存,线程等按钮即可查看当前虚拟机状态.这里就不展开了.


完。







ChangeLog

2019-08-16 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十