JVM 工具实战指南(jmap / jstack / Arthas / MAT)
🔍 从诊断到定位:掌握生产级 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 WAITINGjava.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)打开:
👀 分析思路
- 打开后点击
Leak Suspects Report,让 MAT 自动生成泄漏嫌疑报告 - 分析对象占用情况(Histogram)
- 使用
Dominator Tree查找谁“持有”最多内存 - 找出
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 5 | Top 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 次。常见输出字段:
| 指标 | 含义 |
|---|---|
| YGC | Young GC 次数 |
| FGC | Full GC 次数 |
| YGCT | Young GC 总耗时 |
| FGCT | Full GC 总耗时 |
| S0U/S1U | Survivor 区使用量 |
| OU | Old 区使用量 |
🔍 场景举例
如果 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 实战分析能力,也欢迎留言分享你遇到的难题,我们一起探讨!
相关文章:
JVM 工具实战指南(jmap / jstack / Arthas / MAT)
🔍 从诊断到定位:掌握生产级 JVM 排查工具链 📖 前言:系统故障时,如何快速定位? 无论 JVM 理论多么扎实,当线上服务出现 CPU 飙高、响应超时、内存泄漏或频繁 Full GC 时,仅靠猜测…...
基于springboot+vue的病例管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包: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 增加(insert&…...
【漫话机器学习系列】268. K 折交叉验证(K-Fold Cross-Validation)
图解 K 折交叉验证(K-Fold Cross-Validation)| 原理 数学公式 实践应用 原图作者:Chris Albon,手绘风格清晰易懂,本文基于其图解做详细扩展,适用于机器学习、深度学习初学者及进阶者参考学习。 一、什么是…...
【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核
如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本,此时选择的内核是base虚拟环境的Python内核,如果我想切换成其他conda虚拟环境来运行这个文件该怎么办?下面我们试着还原一下问题,并且解决问题。 【注】 这个问题出…...
【Boost搜索引擎】构建Boost站内搜索引擎实践
目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title 编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…...
学习VS2022离线安装包的下载方法
VS2022企业版、专业版和社区版都支持在线安装和离线安装两种方式,一般而言,联网的电脑基本都用在线安装,上网不方便时就需要使用离线安装包安装。完整的VS2022离线安装包有几十个G(前几天测试时下载VS2022企业版包含所有组件的中文…...
前端开发中的AI辅助测试:从手动到智能的转变
🧪 前端开发中的AI辅助测试:从手动到智能的转变 👤 作者:喜葵 📅 更新时间:2025-05-16 📖 前言 前端测试一直是开发流程中的痛点:写测试代码耗时、维护成本高、覆盖率难提升。随着A…...
Nginx配置记录访问信息
文章目录 方法一:使用Nginx原生配置记录访问信息方法二:使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如:Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中,无论是功…...
HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)
1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网(State Grid Corporation of China,简称 SGCC)的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用,用户可以实时追踪家庭用电量情况&…...
JAVA EE(进阶)_HTML
思如云烟,行若磐石。 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE(进阶)_进阶的开端-CSDN博客 1.HTML HTML(HyperText Mark…...
自定义类、元组、字典和结构体对比——AutoCAD C# 开发中建立不同对象之间的联系
以下是对它们的详细分析和对比: 1. 自定义类(Class) 优势 封装性强:可以定义字段、属性、方法和事件,实现复杂的行为和逻辑。继承与多态:支持继承体系,可通过接口或抽象类实现多态。引用类型…...
鸿蒙北向源码开发: 检查应用接口dts文件api规范性
开源鸿蒙5.0.2对应的api版本是14 5.0社区仓有工具检查接口规范性报告工具: interface/sdk-js/build-tools/api_check_plugin api_check_plugin是什么? 在解释api_check_plugin是什么之前得先知道 应用调用的api接口都是文件名后缀为.d.ts的文件,这些文件内部声明了arkts的a…...
谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频
近期,谷歌旗下的 NotebookLM 即将推出一项令人瞩目的新功能 ——Sparks 视频概览。这一功能借助 Gemini 与 Deep Research 的强大能力,能够生成 1 - 3 分钟的 AI 视频,为用户带来全新的内容创作与信息获取体验。 NotebookLM:AI 笔…...
5月19日笔记
BGP的路由聚合 BGP(Border Gateway Protocol,边界网关协议)是互联网中用于在不同自治系统(AS)之间交换路由信息的一种协议。在BGP中,路由聚合是一种技术,它允许网络管理员通过减少路由表中冗余的…...
从基础到高级:网站反爬技术全景解析与第三方工具对比
网站反爬与用户行为检测实战指南:从基础防护到智能识别 在当今数据驱动的互联网时代,网站面临着日益复杂的爬虫攻击和恶意行为威胁。本文将系统性地介绍网站反爬与用户行为检测的技术体系,包括基本原理、防护策略、第三方组件选型以及真实案例分析,帮助开发者构建更加安全…...
Java面试实战:从Spring Boot到分布式缓存的深度探索
Java面试实战:从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂,面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信,迎接这场技术“拷问”。 第一轮:基础问题 老王&#…...
职坐标AIoT技能培训课程实战解析
职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…...
pytorch小记(二十):深入解析 PyTorch 的 `torch.randn_like`:原理、参数与实战示例
pytorch小记(二十):深入解析 PyTorch 的 torch.randn_like:原理、参数与实战示例 一、函数签名与参数详解二、torch.randn_like vs torch.randn三、基础示例四、进阶用法与参数覆盖4.1 覆盖数据类型(dtype)…...
小结:网页性能优化
网页性能优化是提升用户体验、减少加载时间和提高资源利用率的关键。以下是针对网页生命周期和事件处理的性能优化技巧,结合代码示例,重点覆盖加载、渲染、事件处理和资源管理等方面。 1. 优化加载阶段 减少关键资源请求: 合并CSS/JS文件&a…...
8-游戏详情制作(Navigation组件)
1.1 需求 使用Navigation实现游戏主详情视图,从瀑布流容器中的游戏项(游戏中心首页-游戏瀑布流列表)点击游戏后进入游戏详情页,从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入: 游戏详情&#…...
Unity引擎源码-物理系统详解-其二
继续我们关于Unity的物理系统的源码阅读,不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下:NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…...
1.3.3 数据共享、汇聚和使用中的安全目标
探索数据共享、汇聚与使用中的安全目标 在当今数字化时代,数据的价值愈发凸显,数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而,在这一过程中,数据安全至关重要,我们需要明确并保障保密性、完整性…...
【Docker】Docker安装Redis
目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新,如需下载指定版本可带版本号 docker pull redis:xxx 响应内容: 1.1查看下载的镜像 下载完…...
Oc语言学习 —— Foundation框架总结
1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象,例如:NSString *str "hello"; 因为我们的NSString是不可变的,所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…...
react+html2canvas+jspdf将页面导出pdf
主要使用html2canvasjspdf 1.将前端页面导出为pdf 2.处理导出后图表的截断问题 export default function AIReport() {const handleExport async () > {try {// 需要导出的内容idconst element document.querySelector(#AI-REPORT-CONTAINER);if (!element) {message.err…...
LWIP的Socket接口
Socket接口简介 类似于文件操作的一种网络连接接口,通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…...
基于支持向量机(SVM)的P300检测分类
基于支持向量机(SVM)的P300检测分类MATLAB实现,包含数据预处理、特征提取和分类评估流程: %% P300检测分类完整流程(SVM实现) clc; clear; close all;%% 1. 数据加载与模拟生成(实际应用需替换…...
Better Faster Large Language Models via Multi-token Prediction 原理
目录 模型结构: Memory-efficient implementation: 实验: 1. 在大规模模型上效果显著: 2. 在不同类型任务上的效果: 为什么MLP对效果有提升的几点猜测: 1. 并非所有token对生成质量的影响相同 2. 关…...
51c嵌入式※~合集7~Linux
我自己的原文哦~ https://blog.51cto.com/whaosoft/13926843 一、u-boot和bootloader~区别 Bootloader 比Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那…...
