推荐一个轻量的Java虚拟机监控工具:Jvmm,开箱即用,支持丰富的功能
Jvmm是一个轻量的JVM监控工具,提供有丰富的监控功能:查看JVM信息(Runtime、内存、CPU、线程、GC、ClassLoader等)以及OS信息(内存、磁盘等),可生成火焰图,代码热更,反编译,提供多种服务模式(http、哨兵等)。适合用于服务健康监控、线上调优、排查问题、性能测试等场景。
github: https://github.com/tzfun/jvmm/releases/download/2.0.2/jvmm-2.0.2.zip
gitee: https://gitee.com/tzfun/jvmm/releases/download/2.0.2/jvmm-2.0.2.zip
项目地址:https://github.com/tzfun/jvmm
直接运行
java -jar jvmm.jar
运行后会提示你进入什么模式,我们先将Jvmm attach到一个测试程序中,这里选择 2
接下来会询问你是否使用当前目录的配置文件,你可以选择否然后自己指定一个配置文件路径,这里我们先使用默认的配置,选择Y进入下一步
接下来会提示你选择目标进程,这里我们选择提前启动好的测试程序
最后attach成功之后会提示你它运行在了什么端口,看到这样的提示说明你已经成功的将Jvmm Attach到你的目标程序了,然后你就可以使用它的Client模式与你的程序通信
仍然是运行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.
因为数据项太多就不进行展示了,主要是进程运行情况、参数以及环境变量等信息
info -t process
在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,执行方法与原生调用几乎一样,只是通过Jvmm赋予了其远程调用的能力
你可以通过Client工具关闭正在运行的Jvmm,改关闭操作只是针对于运行的Jvmm Server,并不会影响你的程序正常运行。
Jvmm的Client工具在平时的开发工作中足以满足大部分需求,它还提供了非常多的其他功能,例如Java Agent支持、Http Server服务、哨兵模式、Core API
更多使用方法后续持续更新,创作不易,觉得不错给个star~