0

0

什么是JDK中的jstat命令_环境监控中查看类加载与GC统计

P粉602998670

P粉602998670

发布时间:2026-02-26 10:53:03

|

956人浏览过

|

来源于php中文网

原创

用jstat快速定位类加载异常或gc频繁问题:通过jstat -class 观察loaded持续上升且unloaded≈0,判断classloader泄漏;用jstat -gcutil 1000 5监控e/o使用率波动,e长期>95%预示young gc频繁,o接近100%伴fgc增多则提示老年代压力大。

什么是jdk中的jstat命令_环境监控中查看类加载与gc统计

怎么用 jstat 快速查出类加载异常或 GC 频繁问题

jstat 不是日志分析器,也不是堆快照工具,它只做一件事:在进程活着的时候,实时抓取 JVM 内部的统计快照。想看出类是否在疯狂加载(比如 Spring 动态代理、字节码生成框架引发的泄漏),或者 Young GC 每秒来好几次,就得盯住几个关键字段,而不是扫一眼就划走。

  • jstat -class <pid></pid>loadedunloaded:如果 loaded 持续上涨且 unloaded 基本为 0,大概率有类加载器没被回收(比如 Web 应用热部署后旧 ClassLoader 还挂着)
  • jstat -gcutil <pid> 1000 5</pid> 每秒采一次、共 5 次,重点看 E(Eden 使用率)和 O(Old 使用率):若 E 总在 95% 以上反复横跳,说明对象“活不过一轮 Young GC”,可能对象太大直接进老年代,或 Survivor 区太小导致提前晋升
  • 别只跑一次——jstat 单次输出是瞬时值,没有上下文。必须带 intervalcount(或手动 Ctrl+C 中断),否则看不出趋势

-gc-gcutil 到底该用哪个

二者数据来源完全一样,只是单位不同:-gc 输出 KB,-gcutil 输出百分比。选哪个,取决于你当前要回答的问题。

  • 查内存是否真溢出?用 -gcutil:一眼看到 O 到了 98%,比看 OU=28416.0OC=28672.0 快得多
  • 调参时验证扩容效果?用 -gc:比如加了 -Xmn256m 后,对比 EC 字段是否从 2048.0 变成 262144.0(即 256MB),避免被百分比“平滑掉”实际容量变化
  • JDK 8+ 注意 M(Metaspace)和 CCS(Compressed Class Space):它们不会出现在老版本的 -gcutil 里,但一旦 M 接近 100% 且 FGC 开始上升,就是元空间不足,不是堆内存的事

为什么 jstat -compiler 很少有人用,但它能帮你定位 JIT 失效

多数人忽略这个选项,是因为应用启动后 JIT 编译基本就完成了。但在某些场景下,它的输出是唯一线索。

Descript
Descript

一个多功能的音频和视频编辑引擎

下载
  • 看到 failed 列非零?说明方法被 JIT 编译失败过,常见于:使用了不支持的 JVM TI agent、开启了过于激进的编译阈值(-XX:CompileThreshold)、或代码里有非法字节码(如 ASM 改写出错)
  • compiled 数量长期停滞不动?可能整个应用都卡在解释执行模式,比如用了 -Xint(纯解释模式)却没意识到,或容器环境 CPU 资源受限导致 JIT 线程饿死
  • 注意:jstat -compiler 不显示具体哪些方法没编译,它只告诉你“有事发生”。真要深挖,得切到 -XX:+PrintCompilation 或用 JFR

容易被忽略的兼容性坑:JDK 版本一升级,jstat 字段就对不上

JDK 7 到 JDK 17,jstat 的输出字段增减、重命名、含义调整至少有三次。不是所有文档都及时更新,抄老教程很容易看错列。

  • JDK 7 及以前有 PGC/PGCT(Permanent GC),JDK 8+ 全换成 MC/MU(Metaspace)和 CCSC/CCSU
  • jstat -gccause 在 JDK 9+ 才稳定输出 lgcc(last gc cause),早期版本可能为空或格式混乱
  • 最稳妥的方式:先运行 jstat -options,确认当前 JDK 支持哪些参数;再用 jstat -gc <pid></pid> 看首行字段名,以实际输出为准,别信记忆或截图

字段含义会变,但核心逻辑不变:Eden 满了就 Young GC,Old 涨太快就查对象生命周期,Loaded 类一直增就查 ClassLoader 引用链。工具只是镜子,照得清不清,取决于你盯着哪块玻璃看。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

146

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

82

2026.01.26

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2023.11.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

425

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

598

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

707

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

22

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

721

2023.08.10

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.7万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号