JVM 工具实战指南(jmap / jstack / Arthas / MAT)

news2025/5/21 5:25:02

🔍 从诊断到定位:掌握生产级 JVM 排查工具链

📖 前言:系统故障时,如何快速定位?

无论 JVM 理论多么扎实,当线上服务出现 CPU 飙高、响应超时、内存泄漏或频繁 Full GC 时,仅靠猜测是远远不够的。此时,JVM 工具便成为我们通往真相的放大镜、透视镜和手术刀。

本文将围绕以下目标展开:

  • ✅ 学会使用工具采样信息
  • ✅ 学会解读输出背后的含义
  • ✅ 学会将数据转化为判断依据
  • ✅ 通过真实案例清晰展示问题定位路径

一、JVM 工具体系:能力图谱速览

工具主要用途典型场景
jps查看所有 Java 进程定位目标进程 PID
jstack导出线程堆栈快照分析死锁 / 阻塞 / 高 CPU
jmap查看类占用内存、导出 heap dump分析内存泄漏 / 垃圾对象分布
jstat监控 GC 状况、类加载数据查看 GC 行为 / 元空间使用
Arthas全能在线诊断工具热部署、耗时分析、方法跟踪
MAT图形化 heap dump 分析工具精准定位泄漏引用链 / 根对象

二、线程问题定位:jstack 的使用与实战

📌 用法示例

jstack <pid> > thread_dump.txt

jstack 可以显示当前所有线程的运行状态,包括调用栈、锁状态、是否阻塞等信息。

📚 实战场景:接口无响应,线程数持续上升

导出线程堆栈后发现大量线程处于 BLOCKED 状态:

"DubboServerHandler-10" #89 daemon prio=5 os_prio=0 tid=0x00007f86c4b04800 nid=0x62b WAITING
   java.lang.Thread.State: BLOCKED (on object monitor)
	at com.company.OrderService.lock(OrderService.java:89)

经分析,由于 synchronized 锁竞争严重,导致资源饥饿。最终通过引入 ReentrantLock + tryLock 限时获取锁机制优化。

🔍 小技巧

  • 使用 grep 查看 BLOCKED / WAITING 线程占比
  • nid 使用 top -H -p <pid> 配合分析 CPU 占用高的线程

三、内存问题定位:jmap + MAT 深度分析

🔧 快速导出堆快照

jmap -dump:format=b,file=heap_dump.hprof <pid>

然后使用 Eclipse MAT(Memory Analyzer Tool)打开:

👀 分析思路

  1. 打开后点击 Leak Suspects Report,让 MAT 自动生成泄漏嫌疑报告
  2. 分析对象占用情况(Histogram)
  3. 使用 Dominator Tree 查找谁“持有”最多内存
  4. 找出 GC Roots 路径,理解为何对象无法被释放

🧪 案例:堆积大量 Session 缓存,导致 OOM

通过 MAT 分析后发现 ConcurrentHashMap<String, UserSession> 占用超过 1.5G 且 GC 不释放,最终确认 Session 缓存未清理。使用 WeakReference + TTL 清理机制成功解决。

四、在线诊断神器:Arthas 的核心命令

Arthas 是一款极其强大的 JVM 诊断工具,支持 attach 在线运行系统,非常适合无法重启的生产环境。

🔧 启动方式

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

🔍 常用命令一览

命令作用
dashboard查看 CPU、内存、GC、线程等概况
thread -n 5Top 5 CPU 消耗线程
trace方法执行路径及耗时统计
tt方法调用前后状态记录+回放
watch实时查看参数、返回值、耗时
jad在线反编译 class 文件

🎯 实战:定位某接口性能抖动

trace com.example.service.UserService getUserById

发现方法内部调用 Redis 响应缓慢,约耗时 200ms+。继续向下追踪发现连接池配置过小,导致阻塞排队严重,调大 maxTotal 成功缓解问题。

五、GC 行为实时监控:jstat 快速采样

jstat -gc <pid> 1000 10

每 1 秒输出一次 GC 数据,共 10 次。常见输出字段:

指标含义
YGCYoung GC 次数
FGCFull GC 次数
YGCTYoung GC 总耗时
FGCTFull GC 总耗时
S0U/S1USurvivor 区使用量
OUOld 区使用量

🔍 场景举例

如果 FGC 不断增长,同时 OU 接近上限,说明老年代垃圾回收效果不佳。此时应排查:

  • 是否存在内存泄漏?
  • 是否 Eden 区过小,频繁晋升至老年代?
  • GC 策略是否适合当前业务负载?

六、工具组合建议与踩坑经验

问题类型推荐工具组合
CPU 飙高top + jstack + Arthas trace
接口卡顿Arthas tt/watch/trace
内存泄漏jmap + MAT + jstat
类加载冲突jad, sc, classloader
容器内调试Arthas 支持 docker 内 attach

❗ 常见坑:

  • 容器内使用 jmap 导出 hprof 时注意内存开销,可挂载 volume 后导出到宿主机
  • 使用 jstack 不一定能看出所有问题,建议多次 dump,对比线程状态
  • Arthas 虽强,但 trace 消耗较大,不要在高并发接口长时间 trace

🔚 总结:工具只是手段,思维才是核心

熟练掌握 JVM 工具的核心,不是记住命令,而是形成“现象 → 采样 → 解读 → 结论 → 优化”的完整分析路径。

技术高手的关键,不是写代码快,而是系统出问题时,知道该看什么,如何下手。

📢 下一篇预告:《JVM 性能问题排查实战 10 连击》

👍 如果这篇内容对你有帮助,欢迎点赞 + 收藏 + 关注专栏。让更多工程师掌握 JVM 实战分析能力,也欢迎留言分享你遇到的难题,我们一起探讨!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+vue的病例管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 患者信息管理 医…

SpringBoot(三)--- 数据库基础

目录 前言 一、MySQL 1. 关系型数据库 2.数据模型 二、SQL语句 1.DDL语句 1.1 数据库操作 1.1.1 查询数据库 1.1.2 创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2 表操作 1.2.1 创建表 1.2.2 约束 1.2.3 数据类型 2.DML语句 2.1 增加&#xff08;insert&…

【漫话机器学习系列】268. K 折交叉验证(K-Fold Cross-Validation)

图解 K 折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;| 原理 数学公式 实践应用 原图作者&#xff1a;Chris Albon&#xff0c;手绘风格清晰易懂&#xff0c;本文基于其图解做详细扩展&#xff0c;适用于机器学习、深度学习初学者及进阶者参考学习。 一、什么是…

【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核

如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本&#xff0c;此时选择的内核是base虚拟环境的Python内核&#xff0c;如果我想切换成其他conda虚拟环境来运行这个文件该怎么办&#xff1f;下面我们试着还原一下问题&#xff0c;并且解决问题。 【注】 这个问题出…

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…

Nginx配置记录访问信息

文章目录 方法一&#xff1a;使用Nginx原生配置记录访问信息方法二&#xff1a;使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如&#xff1a;Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中&#xff0c;无论是功…

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网&#xff08;State Grid Corporation of China&#xff0c;简称 SGCC&#xff09;的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用&#xff0c;用户可以实时追踪家庭用电量情况&…

JAVA EE(进阶)_HTML

思如云烟&#xff0c;行若磐石。 ——陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE&#xff08;进阶&#xff09;_进阶的开端-CSDN博客 1.HTML HTML&#xff08;HyperText Mark…

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心&#xff0c;构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路&#xff0c;通过分层递进的知识模块帮助学员建立系统…

8-游戏详情制作(Navigation组件)

1.1 需求 使用Navigation实现游戏主详情视图&#xff0c;从瀑布流容器中的游戏项&#xff08;游戏中心首页-游戏瀑布流列表&#xff09;点击游戏后进入游戏详情页&#xff0c;从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入&#xff1a; 游戏详情&#…

Unity引擎源码-物理系统详解-其二

继续我们关于Unity的物理系统的源码阅读&#xff0c;不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下&#xff1a;NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…

1.3.3 数据共享、汇聚和使用中的安全目标

探索数据共享、汇聚与使用中的安全目标 在当今数字化时代&#xff0c;数据的价值愈发凸显&#xff0c;数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而&#xff0c;在这一过程中&#xff0c;数据安全至关重要&#xff0c;我们需要明确并保障保密性、完整性…

【Docker】Docker安装Redis

目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新&#xff0c;如需下载指定版本可带版本号 docker pull redis:xxx 响应内容&#xff1a; 1.1查看下载的镜像 下载完…

Oc语言学习 —— Foundation框架总结

1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象&#xff0c;例如&#xff1a;NSString *str "hello"; 因为我们的NSString是不可变的&#xff0c;所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口&#xff0c;通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口&#xff0c;但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构&#xff1a; Memory-efficient implementation&#xff1a; 实验&#xff1a; 1. 在大规模模型上效果显著&#xff1a; 2. 在不同类型任务上的效果&#xff1a; 为什么MLP对效果有提升的几点猜测&#xff1a; 1. 并非所有token对生成质量的影响相同 2. 关…

Spring的Validation,这是一套基于注解的权限校验框架

为了保证数据的正确性、完整性&#xff0c;作为一名后端开发工程师&#xff0c;不能仅仅依靠前端来校验数据&#xff0c;还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器&#xff0c;处理校验异常 RestControllerAdvice p…

MySQL - 如何突破单库性能瓶颈

数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的&#xff0c;服务器是数据库的宿主&#xff0c;其性能直接影响了数据库的性能&#xff0c;所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…

apisix透传客户端真实IP(real-ip插件)

文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses&#xff1f;安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理&#xff08;如 Nginx、HAProxy、云厂商的 LB&#xff…

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别&#xff1a;READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别&#xff0c;这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…