Jstat 垃圾回收统计实用指南

目录

  • Jstat 垃圾回收统计实用指南
    • 一、基础使用说明
      • 1. 核心语法格式
      • 2. 快速示例
      • 3. 单位说明
    • 二、常用命令详解
      • 1. `-gc`:显示 GC 次数、时间及堆内存各区域大小/使用量
      • 2. `-gcutil`:以百分比形式统计 GC 核心信息
      • 3. `-gccapacity`:堆内存与方法区容量边界统计
      • 4. `-gcnew`:新生代垃圾回收详细统计
      • 5. `-gcnewcapacity`:新生代内存容量详细统计
      • 6. `-gcold`:老年代垃圾回收详细统计
      • 7. `-gcoldcapacity`:老年代内存容量详细统计
      • 8. `-gccause`:最近一次 GC 统计及回收原因(实用高频)
    • 三、常见 GC 回收原因说明
    • 四、实用排查思路与总结

Jstat 垃圾回收统计实用指南

jstat 是 JDK 自带的轻量级性能监控工具,专门用于收集 JVM 内存与垃圾回收(GC)相关统计信息。它无需提前部署,仅通过进程 ID(PID)即可快速获取实时数据,是排查 JVM 内存泄漏、GC 频繁等问题的必备工具之一。本文将详细讲解 jstat 常用的 GC 相关命令、输出字段含义及实用场景。

一、基础使用说明

1. 核心语法格式

jstat[选项]<进程PID>[采样间隔时间][采样次数]
  • 选项:指定要获取的统计信息类型(如下文的-gc-gcutil等)。
  • 进程PID:运行中的 Java 应用进程 ID(可通过jpsps -ef | grep java命令获取)。
  • 采样间隔时间:可选参数,指定每次统计的时间间隔,支持单位ms(毫秒,默认)、s(秒)、m(分钟),例如3s表示每 3 秒统计一次。
  • 采样次数:可选参数,指定统计的总次数,省略则表示无限次采样,直到手动终止(Ctrl + C)。

2. 快速示例

# 仅统计一次 PID 为 80 的 Java 进程 GC 信息jstat -gc80# 每 3 秒统计一次 PID 为 80 的 Java 进程 GC 信息,无限次采样jstat -gcutil803s# 每 1 秒统计一次 PID 为 80 的 Java 进程 GC 原因,共统计 10 次jstat -gccause801s10

3. 单位说明

本文中未特殊标注的内存单位均为字节(Byte),如需转换为更易读的单位:

  • 字节 → 兆字节(MB):除以1024 * 1024
  • 字节 → 吉字节(GB):除以1024 * 1024 * 1024
  • 时间单位均为秒(s),部分字段会保留小数位(精确到毫秒级别)。

二、常用命令详解

1.-gc:显示 GC 次数、时间及堆内存各区域大小/使用量

命令格式

jstat -gc<PID>[采样间隔][采样次数]

示例jstat -gc 80 3s(每 3 秒统计一次,无限次采样;不写间隔仅统计一次)

输出字段含义(按列顺序):

字段含义
S0C年轻代中第一个幸存区(Survivor 0)的总容量(字节)
S1C年轻代中第二个幸存区(Survivor 1)的总容量(字节)
S0U年轻代中第一个幸存区的已使用容量(字节)
S1U年轻代中第二个幸存区的已使用容量(字节)
EC年轻代中伊甸园区(Eden)的总容量(字节)
EU年轻代中伊甸园区的已使用容量(字节)
OC老年代(Old Generation)的总容量(字节)
OU老年代的已使用容量(字节)
MC方法区(元数据区,Metaspace)的总容量(字节)
MU方法区的已使用容量(字节)
CCSC压缩类空间(Compressed Class Space)的总容量(字节)
CCSU压缩类空间的已使用容量(字节)
YGC应用启动至采样时,年轻代 GC(Minor GC)的总次数
YGCT应用启动至采样时,年轻代 GC 消耗的总时间(秒)
FGC应用启动至采样时,老年代 GC(Full GC,全量回收)的总次数
FGCT应用启动至采样时,老年代 GC 消耗的总时间(秒)
GCT应用启动至采样时,所有 GC(Minor GC + Full GC)消耗的总时间(秒)

适用场景:需要精准了解堆内存各区域(伊甸园区、幸存区、老年代)的容量与实际使用量,判断内存分配是否合理。

2.-gcutil:以百分比形式统计 GC 核心信息

命令格式

jstat -gcutil<PID>[采样间隔][采样次数]

示例jstat -gcutil 80 3s(每 3 秒以百分比形式总结 GC 信息)

输出字段含义

字段含义
S0第一个幸存区已使用容量占其总容量的百分比
S1第二个幸存区已使用容量占其总容量的百分比
E伊甸园区已使用容量占其总容量的百分比
O老年代已使用容量占其总容量的百分比
M方法区(元数据区)已使用容量占其总容量的百分比
CCS压缩类空间已使用容量占其总容量的百分比
YGC应用启动至采样时,年轻代 GC 总次数
YGCT应用启动至采样时,年轻代 GC 总耗时(秒)
FGC应用启动至采样时,老年代 Full GC 总次数
FGCT应用启动至采样时,老年代 Full GC 总耗时(秒)
GCT应用启动至采样时,所有 GC 总耗时(秒)

适用场景:快速监控 GC 整体状态,重点关注各内存区域的使用率变化,判断是否存在内存溢出风险(如老年代使用率持续接近 100%)。

3.-gccapacity:堆内存与方法区容量边界统计

命令格式

jstat -gccapacity<PID>

输出字段含义

字段含义
NGCMN新生代(年轻代 + 幸存区)的最小容量(字节,JVM 启动时的初始最小内存)
NGCMX新生代的最大容量(字节,新生代可扩展的上限)
NGC当前新生代的实际容量(字节)
S0C第一个幸存区的总容量(字节)
S1C第二个幸存区的总容量(字节)
EC伊甸园区的总容量(字节)
OGCMN老年代的最小容量(字节)
OGCMX老年代的最大容量(字节)
OGC当前老年代的实际容量(字节)
OC当前老年代的总容量(字节,与 OGC 一致)
MCMN方法区的最小容量(字节)
MCMX方法区的最大容量(字节)
MC当前方法区的实际容量(字节)
CCSMN压缩类空间的最小容量(字节)
CCSMX压缩类空间的最大容量(字节)
CCSC当前压缩类空间的实际容量(字节)
YGC应用启动至采样时,年轻代 GC 总次数
FGC应用启动至采样时,老年代 Full GC 总次数

适用场景:查看 JVM 堆内存各区域的容量上限、下限及当前配置,验证内存参数(如-Xms-Xmx-XX:MetaspaceSize等)是否生效。

4.-gcnew:新生代垃圾回收详细统计

命令格式

jstat -gcnew<PID>

输出字段含义

字段含义
S0C第一个幸存区的总容量(字节)
S1C第二个幸存区的总容量(字节)
S0U第一个幸存区的已使用容量(字节)
S1U第二个幸存区的已使用容量(字节)
TT对象在新生代中存活的阈值次数(即对象在幸存区中经过 Minor GC 回收后仍存活的最大次数,超过则进入老年代)
MTT对象在新生代中存活的最大阈值次数
DSS期望的幸存区大小(字节,JVM 根据当前内存使用情况计算的最优幸存区容量)
EC伊甸园区的总容量(字节)
EU伊甸园区的已使用容量(字节)
YGC应用启动至采样时,年轻代 GC 总次数
YGCT应用启动至采样时,年轻代 GC 总耗时(秒)

适用场景:深入分析新生代的 GC 行为,了解对象在新生代的存活规律,排查新生代内存分配不合理导致的频繁 Minor GC 问题。

5.-gcnewcapacity:新生代内存容量详细统计

命令格式

jstat -gcnewcapacity<PID>

输出字段含义

字段含义
NGCMN新生代的最小容量(字节)
NGCMX新生代的最大容量(字节)
NGC当前新生代的实际容量(字节)
S0CMX第一个幸存区的最大容量(字节)
S0C当前第一个幸存区的实际容量(字节)
S1CMX第二个幸存区的最大容量(字节)
S1C当前第二个幸存区的实际容量(字节)
ECMX伊甸园区的最大容量(字节)
EC当前伊甸园区的实际容量(字节)
YGC应用启动至采样时,年轻代 GC 总次数
FGC应用启动至采样时,老年代 Full GC 总次数

适用场景:专注于新生代的容量配置分析,查看幸存区、伊甸园区的最大可扩展容量,优化新生代内存分配比例(如-XX:SurvivorRatio配置)。

6.-gcold:老年代垃圾回收详细统计

命令格式

jstat -gcold<PID>

输出字段含义

字段含义
MC方法区的总容量(字节)
MU方法区的已使用容量(字节)
CCSC压缩类空间的总容量(字节)
CCSU压缩类空间的已使用容量(字节)
OC老年代的总容量(字节)
OU老年代的已使用容量(字节)
YGC应用启动至采样时,年轻代 GC 总次数
FGC应用启动至采样时,老年代 Full GC 总次数
FGCT应用启动至采样时,老年代 Full GC 总耗时(秒)
GCT应用启动至采样时,所有 GC 总耗时(秒)

适用场景:分析老年代的内存使用与 Full GC 情况,排查老年代对象堆积、Full GC 耗时过长等问题。

7.-gcoldcapacity:老年代内存容量详细统计

命令格式

jstat -gcoldcapacity<PID>

输出字段含义

字段含义
OGCMN老年代的最小容量(字节)
OGCMX老年代的最大容量(字节)
OGC当前老年代的实际容量(字节)
OC老年代的总容量(字节,与 OGC 一致)
YGC应用启动至采样时,年轻代 GC 总次数
FGC应用启动至采样时,老年代 Full GC 总次数
FGCT应用启动至采样时,老年代 Full GC 总耗时(秒)
GCT应用启动至采样时,所有 GC 总耗时(秒)

适用场景:查看老年代的容量边界与当前配置,验证老年代内存参数(如-Xmn-XX:OldSize等)是否合理,判断老年代是否有足够的扩展空间。

8.-gccause:最近一次 GC 统计及回收原因(实用高频)

命令格式

jstat -gccause<PID>[采样间隔][采样次数]

输出字段含义(在前-gcutil字段基础上增加 2 个核心字段):

字段含义
S0/S1/E/O/M/CCS-gcutil,对应各内存区域的使用百分比
YGC/YGCT/FGC/FGCT/GCT-gcutil,对应各 GC 次数与耗时
LGCC最近一次垃圾回收的原因(Last GC Cause)
GCC当前正在进行的垃圾回收原因(Current GC Cause,若无正在进行的 GC,则显示 “No GC”)

适用场景:快速定位最近一次 GC 的触发原因,是排查突发 GC 问题的首选命令,无需分析大量日志即可获取关键信息。

三、常见 GC 回收原因说明

GC 回收原因直接反映了 JVM 内存运行的状态,以下是最常见及核心的回收原因,重点掌握:

  1. Allocation Failure(最常见)
    • 含义:新生代(伊甸园区)中没有足够的空间存储新创建的对象,触发 Minor GC(年轻代回收)。
    • 说明:这是应用运行过程中的正常 GC 原因,但若频繁触发(如每秒数次),则需警惕新生代内存配置过小、对象创建速度过快或对象无法快速回收等问题。
  2. Metadata GC Threshold
    • 含义:方法区(元数据区)的使用量达到了阈值,触发 GC 回收无用的类元数据信息。
    • 说明:通常与大量动态生成类(如反射、动态代理、框架扫描)相关,若频繁触发,可适当调大方法区容量(-XX:MetaspaceSize-XX:MaxMetaspaceSize)。
  3. Concurrent Mode Failure
    • 含义:CMS 垃圾回收器在并发标记或并发清理阶段,老年代内存不足,无法容纳新生代晋升的对象,导致并发回收失败,触发一次阻塞式的 Full GC。
    • 说明:属于严重问题,会导致应用停顿时间过长,需优化 CMS 相关参数或更换垃圾回收器。
  4. GC Overhead Limit Exceeded
    • 含义:JVM 在短时间内花费了大量时间进行 GC,但回收的内存却极少(默认超过 98% 的时间用于 GC,且回收的内存不足 2%),触发 OOM 错误。
    • 说明:通常是内存泄漏的信号,需排查是否有大对象无法被回收(如静态集合持有大量对象引用)。
  5. No GC
    • 含义:当前没有正在进行的垃圾回收,且最近一次 GC 已完成。
    • 说明:应用内存状态稳定,无明显内存压力。

四、实用排查思路与总结

  1. 快速监控 GC 整体状态:优先使用jstat -gcutil <PID> 1s,观察 O(老年代)使用率是否持续上升、FGC(Full GC)是否频繁,若 FGC 次数过多且耗时过长,需进一步分析。
  2. 定位 GC 触发原因:使用jstat -gccause <PID>,通过 LGCC 字段查看最近一次 GC 原因,若为Allocation Failure频繁触发,优先优化新生代内存;若为Metadata GC Threshold,优化方法区配置。
  3. 验证内存参数配置:使用jstat -gccapacity <PID>,查看 NGCMX、OGCMX 等字段,确认内存参数是否符合预期,避免因参数配置错误导致的内存问题。
  4. 深入分析新生代/老年代:若快速监控无法定位问题,可使用-gcnew-gcold命令,深入了解对象存活规律与内存分配细节,为 JVM 内存参数优化提供数据支撑。

jstat 工具的核心优势是轻量、高效、实时,无需侵入应用即可获取关键 GC 数据,是 JVM 性能监控的入门与核心工具。掌握本文中的常用命令与字段含义,能够快速应对大部分 GC 相关的性能问题,为后续深入学习 JVM 调优打下坚实基础。

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

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

相关文章

USB主机驱动程序枚举过程:完整指南设备识别阶段

USB主机驱动程序如何“看懂”你的设备&#xff1f;——深度解析设备识别全过程你有没有想过&#xff0c;当你把一个U盘插入电脑时&#xff0c;系统是怎么知道它是个存储设备而不是鼠标或键盘的&#xff1f;为什么不需要手动配置端口、中断或地址&#xff0c;操作系统就能自动加…

Qwen2.5-7B网页推理服务搭建:完整部署流程

Qwen2.5-7B网页推理服务搭建&#xff1a;完整部署流程 1. 背景与技术定位 1.1 Qwen2.5-7B 模型简介 Qwen2.5 是阿里云推出的最新一代大语言模型系列&#xff0c;覆盖从 0.5B 到 720B 不同参数规模的多个版本。其中 Qwen2.5-7B 是一个兼具高性能与轻量化特性的中等规模模型&am…

Qwen2.5-7B薪酬报告:行业分析生成

Qwen2.5-7B薪酬报告&#xff1a;行业分析生成 1. 技术背景与应用场景 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在企业级应用中的渗透率持续上升&#xff0c;尤其是在自动化文档生成、数据分析和智能客服等场景中展现出巨大潜力。阿里云推出的 Qwen2.5-7B 模…

从零开始部署Qwen2.5-7B|阿里最新大模型本地化实践

从零开始部署Qwen2.5-7B&#xff5c;阿里最新大模型本地化实践 随着大语言模型&#xff08;LLM&#xff09;在自然语言处理领域的广泛应用&#xff0c;越来越多开发者希望将高性能模型部署到本地环境&#xff0c;实现低延迟、高安全性的推理服务。阿里巴巴通义实验室推出的 Qw…

Qwen2.5-7B表格理解:结构化数据解析教程

Qwen2.5-7B表格理解&#xff1a;结构化数据解析教程 1. 引言 1.1 业务场景描述 在现代企业应用中&#xff0c;结构化数据&#xff08;如表格、CSV、Excel&#xff09;广泛存在于财务报表、客户信息管理、库存系统等场景。然而&#xff0c;传统自然语言模型在处理这类数据时往…

基于51单片机心率脉搏测量及蓝牙APP上传设计

基于51单片机心率脉搏测量&#xff08;程序原理图实物图&#xff09;功能介绍具体功能&#xff1a;1.使用DS18B20温度传感器测量体温&#xff1b;2.使用脉搏/心率传感器测量脉搏/心率&#xff1b;3.LCD1602S实时显示检测到的温度和脉搏/心率&#xff1b;4.通过蓝牙模块将温度和…

计算机毕业设计springboot“帮帮忙”校园跑腿平台 基于SpringBoot的“校园闪送”互助跑腿系统 微信小程序“随叫随到”大学生任务悬赏平台

XXX标题 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。早八赶课、实验连轴、快递堆满门卫、超市排队绕圈——这是多数在校生的日常。时间被课程表切成碎片&#xff0c;却还要为…

一文说清Windbg在内核开发中的核心调试命令

拨开蓝屏迷雾&#xff1a;WinDbg 内核调试实战精要你有没有遇到过这样的场景&#xff1f;系统毫无征兆地蓝屏死机&#xff0c;错误代码一闪而过&#xff0c;重启后一切如常——但问题依旧存在。用户抱怨、产品上线受阻、排查无从下手……这时候&#xff0c;你需要的不是祈祷运气…

Enscape 渲染卡哭?云电脑直接拉满效率!

做建筑设计、可视化的朋友谁懂啊&#xff01;&#x1f92f; 用 Enscape 实时渲染&#xff0c;本地电脑显存不够、CPU 扛不住&#xff0c;跑个漫游画面卡到掉帧&#xff0c;大文件传输还慢吞吞&#xff0c;真的太影响进度了&#xff01;其实找对工具就完事 ——Enscape 搭配云电…

揭秘Redis内存存储背后的高性能密码

文章目录为什么 Redis 需要把所有数据放到内存中&#xff1f;引言什么是 Redis&#xff1f;为什么 Redis 要把所有数据放在内存中&#xff1f;1. 性能是关键2. 数据结构的选择3. 持久化机制RDB 持久化AOF 持久化4. 扩展性与可用性主从复制分片5. 其他原因内存容量的提升数据模型…

估值百亿的“中国版SpaceX”集体冲刺:2026太空掘金战,普通人离星辰大海还有多远?

2026年刚开年&#xff0c;资本圈最火的话题不是AI&#xff0c;而是飞向蓝天的火箭。最近&#xff0c;商业航天领域热闹非凡。蓝箭航天、天兵科技、星河动力、星际荣耀、中科宇航&#xff0c;这五家被大家公认为“中国版SpaceX”的明星企业&#xff0c;正排着队准备上市。大家现…

从零实现es数据库高并发检索优化方案

如何让 Elasticsearch 在百万 QPS 下依然稳如泰山&#xff1f;—— 一套从零构建的高并发检索优化实战方案你有没有经历过这样的场景&#xff1f;大促刚一开始&#xff0c;商品搜索接口突然开始超时。监控面板上&#xff0c;Elasticsearch 集群的 CPU 直冲 95%&#xff0c;GC 时…

Proteus中蜂鸣器不响?有源与无源常见问题排查指南

蜂鸣器在Proteus里怎么就是不响&#xff1f;一文讲透有源与无源的坑点与秘籍你有没有遇到过这种情况&#xff1a;代码写得严丝合缝&#xff0c;逻辑时序也对得上&#xff0c;结果在Proteus仿真中点了运行——一片寂静&#xff0c;蜂鸣器死活不响&#xff1f;别急&#xff0c;这…

React Native搭建环境核心要点(Windows)

从零开始&#xff1a;在 Windows 上高效搭建 React Native 开发环境 你是不是也经历过这样的场景&#xff1f; 兴致勃勃想用 React Native 写个跨平台 App&#xff0c;打开命令行敲下 npx react-native init MyAwesomeApp &#xff0c;结果卡在依赖安装、SDK 路径报错、模拟…

3ds Max 渲染慢?置换开关攻略 + 提速技巧!

做 3D 设计的朋友有没有发现&#xff1f;&#x1f914; 用 3ds MaxV-Ray 渲染时&#xff0c;一打开 “置换” 就卡到不行&#xff0c;关掉立马速度飙升&#xff01;这 “置换” 到底是啥&#xff1f;该开还是关&#xff1f;今天把重点扒清楚&#xff0c;新手也能看懂&#xff5…

AUTOSAR网络管理总线唤醒功能设计与验证

AUTOSAR网络管理总线唤醒功能设计与验证&#xff1a;从机制到实战在现代汽车电子系统中&#xff0c;ECU数量动辄数十个&#xff0c;遍布车身、动力、信息娱乐等各个子系统。这些节点通过CAN、LIN、Ethernet等总线互联&#xff0c;构成了复杂的车载通信网络。随着整车对能效管理…

26.1.9 轮廓线dp 状压最短路 构造

F. Guards In The Storehouse 轮廓线dp 状压 不太懂为什么叫轮廓线&#xff0c;总之就是多行&#xff0c;有一定规则&#xff0c;求和方的涂色方案数&#xff0c;一般会用一个maskmaskmask记录上面已经dpdpdp过的行的状态&#xff0c;据此判断转移是否合法 对于本题&#xff…

SpringAOP---概念、实现、实战全打包(图文讲解)

目录 1.什么是AOP&#xff1f; 1.1基本概念 1.2具体应用 2.AOP是怎么怎么实现的&#xff1f; 2.1静态代理 2.2动态代理 2.2.1cglib 动态代理 2.2.2 JDK 动态代理 3.AOP中的核心概念 4.AOP具体实现&#xff08;权限校验&#xff09; 1.详细版 2.精简版 5总结 大家好…

Qwen2.5-7B聊天机器人:个性化角色定制全攻略

Qwen2.5-7B聊天机器人&#xff1a;个性化角色定制全攻略 1. 背景与技术定位 1.1 Qwen2.5 系列的技术演进 Qwen2.5 是阿里云推出的最新一代大语言模型系列&#xff0c;覆盖从 0.5B 到 720B 参数的多个版本&#xff0c;涵盖基础预训练模型和指令调优模型。其中&#xff0c;Qwen…

环保实验室LIMS系统选型对比:中小环境检测单位的最优之选——硕晟LIMS

在环保行业快速发展的当下&#xff0c;实验室信息管理系统&#xff08;LIMS&#xff09;已成为中小环境检测单位提升工作效率、保障数据准确性和合规性的关键工具。为了帮助中小环境检测单位在众多LIMS供应商中做出明智选择&#xff0c;本文对广州白码、金现代、北京三维天地、…