-
深入理解JVM《JVM监控与性能工具实战 - 系统的诊断工具》
- 网站名称:深入理解JVM《JVM监控与性能工具实战 - 系统的诊断工具》
- 网站分类:技术文章
- 收录时间:2025-10-08 14:06
- 网站地址:
“深入理解JVM《JVM监控与性能工具实战 - 系统的诊断工具》” 网站介绍
“工欲善其事,必先利其器。” 掌握了JVM的理论知识后,我们迫切需要一套强大的工具来洞察其内部的运行状态。本部分将系统介绍如何利用各种监控和诊断工具,将理论知识转化为实际的排查和调优能力。
3.1 监控维度:我们要看什么?
在开始使用工具之前,必须明确监控的目标。对一个JVM进程,我们通常关心以下核心指标:
监控维度 | 关键指标 | 说明 |
GC | GC频率、GC耗时(Minor/Full)、各分区内存变化 | 评估垃圾收集器的效率和健康状况 |
内存 | 堆内存使用率(Eden/S/Old)、非堆内存(Metaspace)、堆外内存 | 判断内存分配是否合理,是否存在泄漏 |
线程 | 线程总数、运行中线程数(Runnable)、阻塞线程数(Blocked)、死锁 | 诊断线程池问题、锁竞争、死锁等 |
CPU | 进程CPU使用率、GC CPU使用率、线程CPU使用率 | 定位CPU热点和资源消耗源 |
I/O | 文件读写、网络读写 | 诊断磁盘或网络瓶颈 |
3.2 命令行神器:JDK自带工具集(jps, jstat, jinfo, jmap, jstack)
JDK自带的一系列命令行工具是诊断问题的“瑞士军刀”,尤其是在Linux服务器环境下,它们是无GUI环境下的首选。
jps (JVM Process Status Tool)
作用:列出当前用户的所有正在运行的Java进程及其主类信息和进程ID(PID)。
常用命令:
jps -l # 输出主类的全限定名
jps -v # 输出JVM启动参数
输出示例:
1234 com.example.MyApplication
5678 org.apache.catalina.startup.Bootstrap
jstat (JVM Statistics Monitoring Tool)
作用:用于监视JVM各种运行状态信息,尤其是GC和类加载信息。这是一个非常强大的监控工具,可以持续输出。
常用命令:
# 语法:jstat -<option> [-t] <pid> <interval> <count>
jstat -gcutil 1234 1s 5 # 每1秒查询一次GC概况,共5次
jstat -gc 1234 1s # 每1秒查询一次GC详细容量信息,持续输出
关键选项:
- -gcutil:以百分比形式输出GC分代区域的使用率摘要。
- -gc:输出各区域的容量和使用量(KB)。
- -class:输出类加载信息。
jstat -gcutil 1234 1s 输出解读:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 65.78 45.67 98.23 95.11 100 2.500 5 1.000 3.500
- S0/S1:Survivor 0/1区使用率
- E:Eden区使用率
- O:Old区使用率
- M:Metaspace使用率
- YGC/YGCT:Young GC次数和总耗时
- FGC/FGCT:Full GC次数和总耗时
- GCT:所有GC的总耗时
通过此输出,可以快速判断:Eden区分配是否过快(YGC频率)、老年代是否即将填满(O值)、Full GC是否频繁(FGC次数)等。
jmap (Memory Map for Java)
作用:生成堆转储快照(heap dump)或查询堆内存的详细信息。警告:jmap -dump 会触发Full GC,并对进程产生较大影响,请谨慎在生产环境使用!
常用命令:
jmap -heap 1234 # 显示堆的摘要信息(分配的内存空间、使用的收集器等)
jmap -histo:live 1234 # 显示堆中对象的直方图(仅统计存活对象,会触发Full GC)
jmap -histo 1234 | head -20 # 显示堆中对象的直方图(不含GC,安全),并查看前20行
jmap -dump:format=b,file=myheap.hprof 1234 # 生成堆转储快照文件,用于后续MAT分析
jstack (Stack Trace for Java)
作用:生成JVM当前时刻的线程快照。主要用于定位线程长时间停顿、死锁、死循环、外部资源等待过高等问题。
常用命令:
jstack 1234 # 打印线程快照
jstack -l 1234 # 打印线程快照,同时显示关于锁的附加信息(常用于死锁检测)
实战:定位CPU过高问题
- top -Hp <pid> 找到CPU占用最高的线程ID(例如 12345)。
- 将线程ID转换为16进制:printf "%x\n" 12345 -> 0x3039。
- jstack <pid> 打印线程栈。
- 在输出的线程栈中,查找 nid=0x3039 的线程,查看其堆栈信息,即可定位到问题代码。
jinfo (Configuration Info for Java)
作用:实时查看和修改虚拟机参数。
常用命令:
jinfo 1234 # 查看所有参数
jinfo -flags 1234 # 查看显式设置的参数
jinfo -flag MaxHeapSize 1234 # 查看某个特定参数的值
jinfo -flag +PrintGC 1234 # 动态开启PrintGC参数(并非所有参数都支持动态修改)
3.3 可视化图形工具:一目了然
对于本地开发或可以连接图形界面的测试环境,可视化工具更直观。
jconsole (Java Monitoring and Management Console)
启动:命令行直接输入 jconsole,然后选择要连接的Java进程。
功能:
- 概述:监控堆内存、线程、类、CPU使用率的曲线图。
- 内存:相当于可视化的 jstat,可查看各内存分区的详细变化。
- 线程:相当于可视化的 jstack,可查看所有线程的状态,并检测死锁。
- VM摘要:相当于 jinfo,查看JVM参数和系统属性。
- MBean:查看和管理MBean。
优点:简单易用,无需配置,JDK自带。
缺点:功能相对基础。
VisualVM (All-in-One Java Troubleshooting Tool)
启动:JDK 8及之前版本在bin目录下提供jvisualvm命令。JDK 9+需要单独下载。
功能:jconsole的超集,被誉为“所有功能于一身的Java故障诊断工具”。
- 插件生态:支持安装强大插件(如GC插件、线程分析插件)。
- 抽样器:可以对CPU和内存进行抽样,快速定位热点方法或分配大量内存的对象。
- Profiler:提供更精确的性能分析(但开销较大,不建议在生产环境使用)。
- 堆转储分析:可以生成和分析堆转储,进行OOM诊断。
实战:使用VisualVM监控远程JVM
- 在目标服务器JVM启动参数中添加:
-Djava.rmi.server.hostname=<服务器IP> \ -Dcom.sun.management.jmxremote.port=9999 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false
- 在本地VisualVM中添加远程主机,输入IP和端口号即可连接。
- Java Mission Control (JMC)
启动:JDK 7u40+开始提供,命令行输入 jmc。
功能:源自JRockit VM,现集成到HotSpot JDK中。它的核心功能是Java飞行记录器(JFR)。
- JFR (Java Flight Recorder):一种低开销的线上监控和 profiling 工具。它可以持续收集JVM和应用程序的详细性能数据,而开销通常小于1%。
- 工作模式:
- 持续记录:始终在后台运行,只保留最近一段时间的数据(环形缓冲区)。
- 触发记录:在出现特定事件(如OOM)时,将环形缓冲区中的数据保存到文件中。
- 分析:JMC可以打开JFR记录的.jfr文件,提供极其详尽的视图来分析GC、内存分配、热点方法、IO、锁竞争等几乎所有方面的问题。
启用JFR:
# 启动时开启
java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar
# 对正在运行的JVM开启
jcmd <pid> JFR.start duration=60s filename=myrecording.jfr
3.4 高级诊断与Profiling
Arthas - 阿里开源Java诊断神器
简介:Arthas是Alibaba开源的Java诊断工具,无需重启应用,即可动态跟踪、诊断线上问题。
安装与启动:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar # 然后选择要attach的Java进程
常用命令:
- dashboard:实时系统面板,查看线程、内存、GC等信息。
- thread <id>:查看指定线程的栈。
- thread -b:一键检测死锁。
- watch com.example.service.UserService getUser '{params, returnObj}' -x 3:观察方法调用的入参和返回值,深度为3。
- trace com.example.service.UserService getUser:追踪方法内部调用路径,并输出每个节点的耗时。
- jad com.example.service.UserService:反编译指定类。
- ognl '@com.example.component@MyComponent@myStaticField':执行ognl表达式,获取静态字段甚至调用方法。
优势:功能强大,几乎无所不能,对线上问题排查效率提升巨大。
async-profiler
简介:一款高性能、低开销的采样分析器,对CPU和Heap分配进行性能分析。
特点:
- 低开销:使用HotSpot特有的API(AsyncGetCallTrace),而非传统的、开销较大的DTrace或 perf_events,性能极高。
- 火焰图:可以生成直观的CPU火焰图和内存分配火焰图,一目了然地定位性能瓶颈。
常用命令:
./profiler.sh -d 30 -f flamegraph.html <pid> # 对进程采样30秒,生成CPU火焰图
./profiler.sh -e alloc -d 60 -f alloc-flamegraph.html <pid> # 采样60秒内存分配,生成内存分配火焰图
3.5 GC日志深度分析工具
配置JVM输出详细的GC日志是分析GC问题的第一步。
开启GC日志参数:
-Xlog:gc*:file=gc.log:time:filecount=10,filesize=100M
# 或 (JDK 8及以前)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
GCeasy
简介:一个在线的GC日志分析平台(https://gceasy.io/)。
用法:将GC日志文件上传到网站,它会自动生成一份非常详尽的可视化报告。
报告内容:
- 关键指标:吞吐量、延迟统计、GC暂停时间。
- GC统计:GC次数、GC原因、各代容量。
- 内存泄漏检测:通过老年代增长趋势图判断潜在内存泄漏。
- 优化建议:根据分析结果提供调优建议。
GCE Viewer / GCViewer
简介:一个开源的离线GC日志分析工具。
用法:下载jar包,在本地运行图形化界面或命令行进行分析。
java -jar gcviewer-1.36.jar gc.log # 打开图形界面
java -jar gcviewer-1.36.jar gc.log summary.csv # 导出摘要到CSV
本章小结
本部分系统介绍了从基础命令行到高级可视化,从在线诊断到离线分析的全套JVM监控工具箱。熟练运用这些工具是每一个Java开发者进阶的必备技能。关键在于:
- 明确目标:我知道我要看什么?(GC、内存、线程还是CPU?)
- 选择工具:根据环境和需求选择最合适的工具(无GUI用jstat/jstack,深挖用Arthas/MAT,全面性能看JFR)。
- 关联分析:通常一个问题需要多个工具结合使用(例如用jstat发现GC频繁,再用jmap dump堆,最后用MAT分析泄漏源)。
在接下来我们将通过真实的案例,综合运用这些工具来解决各种棘手的线上问题。
更多相关网站
- centos Linux编译OpenJdk1.8_linux配置openjdk
- Linux 下安装JDK17_linux的jdk安装
- JDK21你可以不用,新特性还是要了解的
- JDK11的下载安装与环境变量配置java11
- 一文了解JDK12 13 14 GC调优秘籍-附PDF下载
- 程序员:JDK的安装与配置(完整版)_jdk的安装与配置使用
- java工具篇-jdk环境_jdk的环境配置教程
- 删除CentOS系统自带的jdk_centos删除java
- OpenJDK 8 安装_openjdk 8 windows
- Java从零开始:不同系统JDK的安装及Java基本命令
- 深入理解Java虚拟机之自己编译JDK
- MyEclipse中文教程二:JDK、变量安装及配置方法
- JDK1.8安装&环境变量配置_java安装jdk配置环境变量
- 手把手教你配置JDK_如何配置jdk1.8
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
- JDK 8升级高版本JDK指南_jdk1.7升级到1.8会有啥影响
- Windows和Linux环境下的JDK安装教程
- JAVA 8 环境安装配置_java环境如何安装
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- 兔兔工程量计算软件下载 (27)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- segoe ui是什么字体 (27)
- head first java电子版 (32)
- clickhouse中文文档 (28)
- jdk-8u181-linux-x64.tar.gz (32)
- 计算机网络自顶向下pdf (34)
- -dfile.encoding=utf-8 (33)
- jdk1.9下载 (32)