jstat -gc
实时监控堆内存各区域使用量,或通过jmap -heap
查看内存配置与使用摘要,需先获取Java进程ID(jps
或ps
),也可借助jcmd VM.native_memory
分析Native内存。在Linux系统中查看JVM内存状态是性能调优和故障排查的关键操作,以下是6种专业方法及其详细操作步骤,结合命令行工具和系统级监控,确保全面覆盖不同场景需求:
jstat
命令(实时内存监控)
适用场景:实时监控堆内存、GC活动,适合长期观察内存波动
操作步骤:
jstat -gc <pid> 1000 5 # 每1秒采样1次,共5次
输出关键指标解析:
S0C/S1C
:Survivor区容量 (KB)EC/OC
:Eden区/老年代容量 (KB)MU
:元数据区使用量 (Metaspace)YGC/YGCT
:Young GC次数/耗时FGC/FGCT
:Full GC次数/耗时
优势:低开销,适合生产环境持续监控。
jcmd
命令(详细内存快照)
适用场景:获取JVM内部详细内存报告
操作步骤:
jcmd <pid> VM.native_memory summary # 查看Native Memory jcmd <pid> GC.heap_info # 输出堆内存分布
输出解读:
Total reserved
:JVM保留的总内存Committed
:实际向系统申请的内存- 按模块分类(Java Heap/Class/Thread/Code等)
注意:需启动时添加-XX:NativeMemoryTracking=summary
。
jmap
命令(堆内存直方图与Dump)
适用场景:分析对象分布或生成堆转储文件
基础命令:
jmap -heap <pid> # 堆内存配置摘要 jmap -histo:live <pid> # 存活对象统计(按类排序) jmap -dump:live,file=heap.hprof <pid> # 生成堆转储文件
关键输出:
- 对象数量及占用内存排名(排查内存泄漏)
- 堆配置参数(NewRatio/SurvivorRatio等)
风险提示:jmap -dump
可能暂停应用,生产环境慎用。
图形化工具(JConsole/VisualVM)
适用场景:直观分析内存趋势,适合开发环境
操作流程:
- 启动JVM时添加JMX参数:
-Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
- 本地运行
jconsole
或jvisualvm
,连接远程进程
功能亮点:
- 实时堆/非堆内存折线图
- 线程/类加载监控
- MBean操作支持
系统级内存检查(/proc 文件系统)
适用场景:验证JVM实际物理内存占用
操作命令:
cat /proc/<pid>/status | grep -E 'VmRSS|VmSize' # 物理内存(RSS) vs 虚拟内存(Size) cat /proc/<pid>/smaps | grep -i heap # 定位堆内存物理映射
指标说明:
VmRSS
:JVM实际使用的物理内存(含堆外)VmSize
:JVM申请的虚拟内存总量
优势:不依赖JDK工具,通用性强。
Arthas(在线诊断神器)
适用场景:动态诊断无需重启,支持内存泄漏分析
操作示例:
dashboard # 实时内存/线程面板 memory # 内存使用报告 heapdump /tmp/heap.hprof # 安全生成堆Dump
功能特色:
- 对象占用统计:
sc -d *ClassName
查看类加载器 - OQL表达式查询对象
推荐:开源工具,支持生产环境热修复。
最佳实践建议
- 日常监控 → 首选
jstat
+/proc
组合(低开销) - 内存泄漏分析 →
jmap -histo
或Arthas
在线诊断 - 深度剖析 → 生成堆Dump用MAT(Eclipse Memory Analyzer)分析
- 容器环境:确保JDK工具包已安装(如
openjdk-11-tools
)
引用说明:
本文方法参考Oracle官方文档《JDK Tools and Utilities》及Arthas开源项目文档,部分命令参数基于OpenJDK 11验证,系统级指标遵循Linux procfs规范。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/23558.html