jvm常用监控命令总结

前言

在生产环境中,为了保证Java应用的健康运行,需要动态检测应用运转过程中的各种指标,比较常见的像CPU利用率,内存使用,堆栈是否正常等

另一方面,生产环境中出现的各种问题,包括异常信息等,都可以通过一些监控指标进行呈现,通过这些指标指导运维和开发人员快速排查问题定位问题与解决问题

但说到底,监控的本身离不开原始数据的采集,而JVM本身可以通过相关的命令得出许多有助于分析,排查和定位问题的源信息,本篇将介绍开发过程中常用的一些JVM监控命令,方便工作中快速查阅

命令 说明 常用形式
jps 查看java进程pid jps
jinfo 查看jvm环境与参数 jinfo pid > a.txt
jstat 查看jvm内存与GC状态 jstat -gcutil pid 1000 10
jstack 查看各线程调用方法堆栈 jstack -l pid
jmap 生成dump文件 jmap -dump:live,format=b,file=dump.hprof pid
jmap 生成统计信息 jmap -histo pid
jhat dump分析工具 jhat dump.hprof

下面主要围绕这几个命令分别进行说明

jps

列出当前服务器的所有运行中的Java进程的PID

在这里插入图片描述
如果单纯是想查看当前服务器上运行的进程,也可以通过下面的命令查看

ps -ef
ps -ef | grep java [查看Java进程]
netstat -ltnp [查看本机各端口的网络连接情况]
netstat -ltnp | grep java [查看本机java相关的网络连接情况]
netstat -tulpn [和上面的差不多]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jinfo

查看jvm环境与参数

在上面通过JPS命令打印出了各个进程的信息之后,可以通过jinfo + pid 输出当前这个进程相关的详细信息

比如,当前运行的Java环境信息,class文件位置,以及最后的当前PID相关的堆栈分配信息等
在这里插入图片描述
在这里插入图片描述
需要说明的是,这里的堆栈分配空间信息都是静态的,还无法很好的反映运行时的状态,如果这样查看不方便,可以通过下面的命令将jinfo的详细信息输出到文件中查看

jinfo pid > a.txt

jstat

在这里插入图片描述

查看jvm内存相关的统计信息与GC状态 jstat -gcutil pid 1000 10

在这里插入图片描述

结合上面的堆区的结构图一起理解,通过这个命令,可以展示出某个Java进程在当前时刻,JVM中堆的各个区域内存占用情况,这里是以百分比的形式呈现,运维或者开发的同学看到这个数据,可以直观的看出堆中各个区域的内存消耗是否正常,比如上图展示的数据,表明堆的区域处于比较健康运行的状态,如果是E区的数值偏高呢?

  • S0: 幸存者区0
  • S1:幸存者区1
  • E:eden区
  • O:old区
  • M:元空间(JDK8)
  • CCS:压缩类空间利用率为百分比
  • YGC:年轻一代GC事件次数
  • YGCT:年轻一代垃圾收集时间
  • FGC:完整的GC事件的数量
  • GCT:垃圾收集总时间

如果想直接查看数值而不是百分比,可以直接通过下面的命令查看,

jstat -gc 16485 1000 10

在这里插入图片描述
jstat扩展

输出当前进程的类加载信息

jstat -class pid

在这里插入图片描述
查看GC相关

-gc、 -gcutil、-gccause,-gcnew,-gcold

在上面我们使用了 -gc打印了当前时刻某个进程的GC相关信息
在这里插入图片描述
查看当前进程发生GC的原因

jstat -gccause 16485

在这里插入图片描述

查看JIT编译信息

-compiler ,-printcompilation

在这里插入图片描述

jstack

查看并打印各线程调用方法堆栈信息的快照

基本用法:

jstack PID

附加选项:

jstack -l PID 显示锁的额外信息
jstack -e PID 显示有关线程的额外信息,比如分配的内存,定义了多少个类等

常用命令:

jstack -l PID 查看当前进程中的所有线程,以及各个线程中的调用堆栈信息

在这里插入图片描述
如果里面的线程堆栈信息太多,命令行窗口查看不方便,可以输出到文件中查看,通过读懂这些打印输出的线程堆栈信息,比如说当出现线程死锁时,就可以反映出来,方便开发人员快速定位程序问题

其实来说,这个命令在开发测试阶段做问题快速定位还是可以使用的,但是在生产环境下,一般不建议这么搞,毕竟打印出来的线程堆栈信息太多了,不方便查看,一般来说,是导出来之后,结合其他的分析工具配合使用更有效果

jmap

用于展示JVM中某个进程中对象内存映射或堆内存的详细信息,由于该命令属于实验性的,JDK8支持,在更高的版本中,部分功能可以使用jhsdb 代替,也可以使用jcmd代替

命令使用形式

jmap [options] pid

常用命令:

jmap -clastats pid 查看进程中类的统计信息
jmap -histo pid | head -n 20 生成统计信息,输出最占空间的前20个统计信息

在这里插入图片描述
从统计结果,可以清楚的看到整个进程中的class各个元数据占用的大小,实例个数信息等,同时这些数据可以帮助我们了解到在当前的应用中,那些对象最占用空间,最占用空间的类信息等,以便开发人员快速定位程序代码进行修正优化

输出线程的堆栈信息到dunp文件

jmap -dump:live,format=b,file=dump.hprof pid

使用jmap将进程的堆栈信息输出到dump文件中,是在平时开发过程中对相关生产问题进行排错的重要手段,比如像OOM信息等,就可以借助输出的dump文件导入到可视化分析工具中进行细致的排查,是开发过程中的基本思路,下面我们来演示下

关于上面的命令简单解释下,

  • -dump:live 表示dump那些还存活的对象
  • format=b 表示以二进制格式输出
  • file=dump.hprof pid 输出文件的命名

在这里插入图片描述
输出得到的dump.hprof文件就可以导出到可视化工具中进行堆栈日志分析,比如像 jvisualvm 或者Eclipse Memory Analyzer(MAP) 进行分析,后续的文章中将会提到

猜你喜欢

转载自blog.csdn.net/zhangcongyi420/article/details/112131955