如何使用Arthas进行内存分析?
Arthas 内存分析完整教程(生产可用)
Arthas 可以不重启、不停服,直接排查 Java 内存问题:内存飙高、内存泄漏、OOM、对象过多、GC 频繁等。
我给你整理最实用、最常用的内存分析命令,直接复制就能用。
一、先看整体内存状况(dashboard)
第一步永远是看全局内存、GC、堆使用情况。
bash
运行
dashboard重点看这几列:
- HEAP:堆内存使用(伊甸区、幸存者区、老年代)
- NOHEAP:元空间 / 非堆内存
- GC:GC 次数、GC 耗时(GC 飙高 = 内存有问题)
按q/Ctrl+C退出。
二、导出堆快照(最关键!)
要定位内存泄漏、大对象、谁占内存,必须导出堆快照(hprof 文件)。
命令
bash
运行
heapdump推荐(只导出存活对象,文件更小)
bash
运行
heapdump --live /tmp/myheap.hprof导出后,用以下工具分析:
- JProfiler
- Eclipse MAT(免费)
- IDEA 自带 Profiler
三、查看 JVM 内存详细配置(jvm)
bash
运行
jvm能看到:
- 堆最大 / 最小内存
- 伊甸区:幸存者区比例
- 垃圾收集器(G1/ZGC/CMS)
- 直接内存、元空间大小
四、查看类的实例数量 & 占用内存(最实用!)
1. 按对象占用内存倒序(排障神器)
bash
运行
dashboard -i 1000 -n 1看Memory区域,会显示:
- 占用内存最大的类
- 实例数量
- 字节数
2. 精确查看某个类的实例数
bash
运行
sc -d com.example.User # 先确认类已加载bash
运行
getstatic com.example.User instanceCount3. 查看所有类的实例数 & 内存(按大小排序)
bash
运行
classloader -a或
bash
运行
ognl '@java.lang.management.ManagementFactory@getMemoryMXBean().getHeapMemoryUsage()'五、查看对象具体内容(排查大对象)
如果你发现某个类实例超多,想看里面存了什么数据:
bash
运行
vmtool -a -f com.example.User会打印出内存中所有 User 对象的内容。
如果只想看10 个:
bash
运行
vmtool -a -n 10 -f com.example.User六、排查 GC 频繁 / 内存飙高套路(生产标准流程)
步骤 1:看整体
bash
运行
dashboard看HEAP 使用率、GC 次数是否疯狂上涨。
步骤 2:导出堆快照
bash
运行
heapdump --live /tmp/heap.hprof步骤 3:看哪些类实例最多
bash
运行
vmtool --action getInstances --className java.util.ArrayList --limit 10步骤 4:看 GC 详情
bash
运行
gc -i 1000每 1 秒打印一次 GC 情况。
七、快速判断是否内存泄漏
满足以下特征 = 90% 内存泄漏:
- 堆内存持续上涨,不会回落
- FullGC 后内存下降很少
- 某个业务类实例数越来越多,不释放
- 项目运行时间越久,内存越高
处理方法:
- 用
heapdump导出快照 - 用 MAT/JProfiler 查看GC Roots
- 定位:谁持有了这个对象,导致无法回收
八、最常用内存命令汇总
bash
运行
dashboard # 全局内存+GC看板 heapdump # 导出堆快照(排查泄漏必备) jvm # 查看JVM内存配置 gc # 实时GC监控 vmtool -a -f 类名 # 查看内存中的对象实例 sc -d 类名 # 查看类是否被加载总结
- dashboard:看整体内存与 GC
- heapdump:定位内存泄漏的核心
- vmtool:查看类实例与内容
- gc:监控 GC 是否异常
