当前位置:首页 > Linux > 正文

Linux快速查看JVM内存命令

使用 jstat -gc 实时监控堆内存各区域使用量,或通过 jmap -heap 查看内存配置与使用摘要,需先获取Java进程ID( jpsps),也可借助 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内部详细内存报告
操作步骤

Linux快速查看JVM内存命令  第1张

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)

适用场景:直观分析内存趋势,适合开发环境
操作流程

  1. 启动JVM时添加JMX参数:
    -Dcom.sun.management.jmxremote.port=9010
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
  2. 本地运行 jconsolejvisualvm,连接远程进程
    功能亮点
  • 实时堆/非堆内存折线图
  • 线程/类加载监控
  • 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 -histoArthas 在线诊断
  • 深度剖析 → 生成堆Dump用MAT(Eclipse Memory Analyzer)分析
  • 容器环境:确保JDK工具包已安装(如 openjdk-11-tools

引用说明
本文方法参考Oracle官方文档《JDK Tools and Utilities》及Arthas开源项目文档,部分命令参数基于OpenJDK 11验证,系统级指标遵循Linux procfs规范。

0