JVM 监控

mac2025-01-25  43

文章目录

命令行工具jps: 虚拟机进程状况工具jstat: 虚拟机统计信息监视工具jinfo: Java配置信息工具jmap: Java内存映像工具jhat: 虚拟机堆转储快照分析工具jstack: Java 堆栈跟踪工具 可视化工具JConsole: Java 监视与管理控制台VisualVM:多合一故障处理工具 连接远程虚拟机启动时指定虚拟机参数配合jstatd工具提供监控数据 注: 内容部分来源于《深入理解Java虚拟机》第二版

使用虚拟机监控工具,可以让我们更快捷和方便的了解程序的运行情况,帮让我们解决问题、优化代码。 JDK/bin 目录下有着 Java 给我们提供的工具,用于监控JVM的运行状况。

命令行工具

jps: 虚拟机进程状况工具

jps -l 参数说明-q只输出本地虚拟机ID,省略主类的名称-m输出虚拟机进程启动时传递给主类 main 函数的参数-l输出主类的全名,如果进程执行的是 jar 包,输出 jar 路径-v输出虚拟机进程启动时 JVM 参数

jstat: 虚拟机统计信息监视工具

jstat -gc 2764 250 20

命令说明:每隔250毫秒查询一次虚拟机进程 2764 的 gc 状况,一共查询20次

jinfo: Java配置信息工具

查询全部配置信息,$LVMID表示虚拟机进程ID

jinfo $LVMID

查询BytecodeVerificationLocal参数值

jinfo -flag BytecodeVerificationLocal 29116

jmap: Java内存映像工具

jmap (Memory Map for Java) 命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件),就是将当前的虚拟机信息以文件的形式保存下来。

jmap 的作用不仅仅是为了获取dump文件,它还可以查询finalize执行队列、java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。

选项说明-dump生成java堆转储快照。格式为:-dump:[live, ]format-b, file=, 其中live 子参数说明是否只输出dump 出存活的对象-finalizerinfo显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。-heap显示Java 堆详细信息,如使用那种回收器、参数配置、分代状况等。-histo显示堆中对象统计信息,包括类、实例数量、合计容量-permstat以ClassLoader 为统计口径显示永久代内存状态-F当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成 dump 快照。

因JDK 版本不同,低版本中有部分选项只在 Linux/Solaris 下可以使用

示例:

jmap -dump:format=b,file=my.bin 3500

jhat: 虚拟机堆转储快照分析工具

jhat my.bin

运行成功之后,在浏览器访问: http://localhost:7000/ 就可以看到分析结果

jstack: Java 堆栈跟踪工具

jstack 命令用于生成虚拟机当前时刻的线程快照。

选项说明-F当正常的输出请求不被响应时,强制输出线程堆栈-l除堆栈外,显示关于锁的附加信息-m如果调用到本地方法的话,可以显示 C/C++ 的堆栈

示例:

jstack -l 29116

可视化工具

JConsole: Java 监视与管理控制台

VisualVM:多合一故障处理工具

连接远程虚拟机

启动时指定虚拟机参数

-Dcom.sun.management.jmxremote.port=8096 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=106.14.32.244

示例:

java -Dcom.sun.management.jmxremote.port=8096 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=106.14.xxx.xxx -jar security-0.0.1-SNAPSHOT.jar

经测试,这种方式可以使用 JConsole 来连接

配合jstatd工具提供监控数据

在JAVA_HOME/bin目录中创建文件jstatdAllPolicy(这个文件名称可以随便起,需要与jstatd启动时指定名称相同),将以下内容拷贝到文件中,并且保证文件的权限以及用户都正确: grant codebase"file:${java.home}/../lib/tools.jar"{ permission java.security.AllPermission; }; 在JAVA_HOME/bin目录中,执行以下命令: ./jstatd -J-Djava.security.policy=jstatdAllPolicy -p 8600 -J-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx

经过测试,这种方式可以使用 jvisualvm 来连接:


参考:https://blog.csdn.net/chwshuang/article/details/44202561

最新回复(0)