






















JVM 性能监控与调优是保障 Java 应用稳定运行的核心环节,目标是减少内存溢出(OOM)风险、降低 GC 停顿时间、提高资源利用率(CPU / 内存)。整个过程需遵循 “监控指标→定位瓶颈→调整参数→验证效果” 的闭环,具体步骤和工具如下:
监控是调优的前提,需通过工具实时或离线采集关键指标,识别性能瓶颈(如内存泄漏、GC 频繁、线程阻塞等)。
按使用场景分为命令行工具(轻量、适合服务器环境)、可视化工具(直观、适合问题分析)、APM 工具(全链路监控、适合生产环境)。
jps:查看 Java 进程 ID(基础工具,用于定位目标进程)
jps -l # 显示进程ID和主类全路径(如 12345 com.example.Application)
jstat:监控 JVM 内存和 GC 状态(最常用的实时监控工具)
# 格式:jstat -<选项> <进程ID> <间隔时间(ms)> <次数>
jstat -gc 12345 1000 10
关键指标(以-gc为例):
S0C/S1C:Survivor 区总容量;S0U/S1U:Survivor 区已使用容量EC/EU:Eden 区总容量 / 已使用容量OC/OU:老年代总容量 / 已使用容量MC/MU:元空间总容量 / 已使用容量YGC/YGCT:新生代 GC 次数 / 总耗时(秒)FGC/FGCT:Full GC 次数 / 总耗时(秒)GCT:GC 总耗时(秒)jmap:生成堆快照(.hprof)或查看堆内存分布(用于分析内存泄漏、大对象)
jmap -heap 12345 # 查看堆内存配置和使用情况(如各区域大小、GC收集器)
jmap -dump:format=b,file=heap.hprof 12345
jstack:查看线程栈信息(用于分析线程阻塞、死锁、CPU 过高)
jstack 12345 > thread.log # 导出线程栈到文件
# 结合top命令定位高CPU线程:top -Hp 12345 找到高CPU线程ID(十进制),转为十六进制在thread.log中搜索
关键信息:线程状态(RUNNABLE/BLOCKED/WAITING)、锁信息(如synchronized阻塞的锁对象)。
jinfo:查看或修改 JVM 参数(动态调整部分参数,如 GC 日志开关)
jinfo -flags 12345 # 查看当前JVM所有参数(如-Xms、-XX:UseG1GC等)
jinfo -sysprops 12345
JConsole:JDK 自带的简易监控工具(jconsole命令启动),支持监控:
VisualVM:功能更全面的可视化工具(需单独下载VisualVM),支持:
MAT(Memory Analyzer Tool):专注堆快照分析(下载地址),用于定位内存泄漏:
GCEasy:在线 GC 日志分析工具(官网),上传 GC 日志后生成可视化报告:
适合分布式系统,结合业务指标监控 JVM 性能,如:
jmx_exporter暴露 JVM 指标(如堆内存、GC 次数),Grafana 可视化监控面板,支持告警(如 GC 停顿超阈值)。Metricbeat采集 JVM 指标,Elasticsearch存储,Kibana可视化,适合大规模集群监控。内存指标:
OutOfMemoryError: Direct buffer memory)。GC 指标:
线程指标:
BLOCKED线程过多(锁竞争激烈)、WAITING线程过多(如线程池队列满导致线程等待)。CPU 与负载:
调优需基于监控数据定位瓶颈,而非盲目调整参数。核心步骤:明确目标→采集数据→分析瓶颈→调整参数→验证效果。
现象:老年代内存持续增长,Full GC 后内存不下降,最终 OOM;jmap -histo:live 显示某类实例数异常多。排查:
jmap -dump或 OOM 自动生成);-Xmx),但需结合代码修复(否则只是推迟 OOM)。现象:jstat 显示 YGC 每秒多次,或 Full GC 每几分钟一次,GC 总耗时占比高(>10%)。排查:
-Xmn(如从 1G 增至 2G),减少 YGC 次数;-XX:SurvivorRatio=6(Eden:S0:S1=6:1:1,增大 Survivor 区,减少对象提前进入老年代);-XX:PretenureSizeThreshold=1048576(1MB 以上大对象直接进入老年代,避免新生代频繁 GC);-XX:MaxGCPauseMillis=100控制停顿时间。现象:单次 GC 停顿 > 1s(如 Full GC 耗时 5s),导致应用响应超时(如 Web 请求超时)。排查:
-XX:G1HeapRegionSize=8m(增大区域大小,减少区域数量)、-XX:InitiatingHeapOccupancyPercent=40(提前触发混合回收,避免老年代占比过高);现象:应用响应慢,jstack 显示大量BLOCKED线程,或存在死锁(Found one Java-level deadlock)。排查:
BLOCKED线程等待的锁对象被少数线程长期持有(如synchronized修饰的慢方法)。
调优方案:ReentrantLock替代synchronized,支持公平锁 / 尝试获取);Atomic类、ConcurrentHashMap 替代同步容器)。现象:元空间内存持续增长,jstat -gc显示MU接近MC,最终 OOM。原因:频繁动态生成类(如 CGLib 代理、反射生成类),且类未被卸载(类加载器未回收)。调优方案:
-XX:MaxMetaspaceSize=512m(临时缓解);proxyTargetClass=true减少动态类)、避免频繁创建类加载器。JVM 性能监控的核心是通过工具(jstat、MAT、APM)采集内存、GC、线程指标;调优则需针对具体瓶颈(内存泄漏、GC 频繁、线程阻塞),结合业务目标调整参数或优化代码。关键是形成 “监控→分析→调整→验证” 的闭环,而非依赖经验主义。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。