一款轻量的JVM监控工具——Jvmm

关于Jvmm

在这里插入图片描述

推荐一个轻量的Java虚拟机监控工具: Jvmm ,开箱即用,支持丰富的功能

功能支持

  • 支持监控虚拟机gc统计信息、内存使用情况、内存池信息、类文件加载统计、线程堆栈
  • 支持监控物理机基础信息、内存使用情况、磁盘使用情况、cpu负载
  • 支持获取Java运行时启动参数、虚拟机参数、properties参数
  • 支持远程执行JDK自带工具,jps、jstat、jstack、jinfo、jmap、jcmd等
  • 支持生成火焰图(采样事件包括CPU、内存分配、线程栈、Java方法调用栈等)
  • 支持代码反编译生成
  • 支持代码热更新(可指定ClassLoader)
  • 支持远程执行GC
  • 提供客户端交互工具,支持跨进程attach和远程连接功能
  • 支持三种服务模式,足以应对大部分监控场景,可同时开启多个服务
    • jvmm服务:独有通信协议,需使用jvmm客户端远程连接调用
    • http服务:提供Http接口,不限语言远程调用
    • 哨兵:定时采集数据并上报给订阅者
  • 支持在自己项目中直接使用jvmm,只需引入server模块
  • 支持基于core模块进行二次开发
  • 支持 JDK 8+
  • 支持 Linux/Mac/Windows

Jvmm是一个轻量的JVM监控工具,提供有丰富的监控功能:查看JVM信息(Runtime、内存、CPU、线程、GC、ClassLoader等)以及OS信息(内存、磁盘等),可生成火焰图,代码热更,反编译,提供多种服务模式(http、哨兵等)。适合用于服务健康监控、线上调优、排查问题、性能测试等场景。

下载地址

项目地址 https://github.com/tzfun/jvmm

快速上手

直接运行

java -jar jvmm.jar

运行后会提示你进入什么模式,我们先将Jvmm attach到一个测试程序中,这里选择 2

select mode
接下来会询问你是否使用当前目录的配置文件,你可以选择否然后自己指定一个配置文件路径,这里我们先使用默认的配置,选择 Y 进入下一步

接下来会提示你选择目标进程,这里我们选择提前启动好的测试程序
选择进程
最后attach成功之后会提示你它运行在了什么端口,看到这样的提示说明你已经成功的将Jvmm Attach到你的目标程序了,然后你就可以使用它的Client模式与你的程序通信
Attach Success
仍然是运行 java -jar jvmm.jar 进入模式选择,这一次我们选择1 client模式
在这里插入图片描述
接下来会提示你需要连接的Jvmm目标程序地址,前面我们attach的时候提示是运行在5010端口,这里就填 127.0.0.1:5010

然后会提示你目标程序需不需要身份认证,因为默认配置文件里没有开启认证所以这里选择否直接连接,如果提示下面的信息说明你就成功连接上了你的程序。
在这里插入图片描述

剩下的就是使用它内置的命令进行查看监控数据或者执行一些操作

监控功能

> help info
info: -
Get information about the target server
 -f <output>   File path (optional), output info to file.
 -t <type>     Info type (required *), optional values: system, systemDynamic, classloading, classloader, compilation, gc,
               process, memory, memoryManager, memoryPool, thread, threadStack.

查看操作系统基础信息

操作系统

查看操作系统CPU负载、内存使用情况、磁盘占用情况

在这里插入图片描述

查看类加载统计

在这里插入图片描述

查看类加载器实例信息

在这里插入图片描述

查看编译统计信息

在这里插入图片描述

查看垃圾收集器信息

在这里插入图片描述

查看进程信息

因为数据项太多就不进行展示了,主要是进程运行情况、参数以及环境变量等信息

info -t process

查看JVM内存信息

在这里插入图片描述

查看JVM内存管理器

在这里插入图片描述

查看JVM内存池

在这里插入图片描述

查看线程情况

在这里插入图片描述

查看线程堆栈

在这里插入图片描述

生成火焰图

在Linux和Mac环境下可以生成火焰图,支持较多的采样事件,也可以针对于Java方法调用栈进行采样跟踪,下面是使用方法

> help profiler

profiler: -
Get server sampling report. Only supported on MacOS and Linux.
 -c <counter>    Sample counter type, optional values: samples, total. Default value: samples.
 -e <event>      Sample event, optional values: cpu, alloc, lock, wall, itimer. Default value: cpu.
 -f <file>       Output file path, supported file type: html, txt, jfr. If not filled, will output text content
 -i <interval>   The time interval of the unit to collect samples, the unit is nanosecond. Default value: 10000000 ns.
 -t <time>       Sampling interval time, the unit is second. Default value: 10 s.

比如我直接执行 profiler -t 2 就可以针对于目标进程进行CPU样本采样2秒,并生成报告
在这里插入图片描述
不过一般为了方便查看,生成可视化的火焰图是更好的选择

profiler -t 5 -f flame_graph.html

执行后等待5秒就会生成这样一份火焰图报告
在这里插入图片描述
你可以选择不同的采样事件,下面给出一些示例:

wall 查看所有线程调用栈

profiler -e wall -t 5 -f flame_graph.html

在这里插入图片描述

alloc 查看内存分配

profiler -e alloc -t 5 -f flame_graph.html

查看方法调用栈

profiler -e java.net.ServerSocket.accept -t 10 -f flame_graph.html

在这里插入图片描述

反编译代码

使用Jvmm也可以反编译代码,帮助你在运行时查看源码

> help jad
You can use the following command in client mode.

jad: -
Shutdown service.
 -c <class>    Required, the java class to be decompiled
 -f <file>     Output file path
 -m <method>   Specify the method name in the decompiled class

在这里插入图片描述
你也可以指定某一个方法查看源码
在这里插入图片描述

执行JVM Tools

你可以远程执行JVM Tools,执行方法与原生调用几乎一样,只是通过Jvmm赋予了其远程调用的能力

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

关闭Jvmm

你可以通过Client工具关闭正在运行的Jvmm,改关闭操作只是针对于运行的Jvmm Server,并不会影响你的程序正常运行。
在这里插入图片描述

拓展使用

Jvmm的Client工具在平时的开发工作中足以满足大部分需求,它还提供了非常多的其他功能,例如 Java Agent支持 Http Server服务 哨兵模式 Core API

更多使用方法后续持续更新,创作不易,觉得不错给个star~


版权声明:本文为qq_36934826原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。