十分钟学会GC问题简单排查流程

背景

线上的Java服务经常会遇到内存回收不到而导致GC频繁发生,严重影响服务质量,那么遇到这种问题该如何排查?本文就是一个GC问题排查的简单系统性分析。

一、如何排查

1.日志监控平台

目前市面上大多数公司都接入了日志监控系统,比如Grafana,一般这些系统都会配置收集各个集群里面每个实例的JVM监控信息。所以在监控平台里面我们就可以看到这些实例的GC信息,并对GC进行报警设置。所以通过经验的增加,也许从日志监控平台就能快速发现问题所在。

2.命令jstat

通过一些自带的命令,登录上服务器去查看实时的GC情况。

2.1 jstat -gc

显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。

image-20240702224204088

2.2 jstat -gcutil

显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。

image-20240702224239296

表头 含义
EC Eden区的大小
EU Eden区已使用的大小
S0C 幸存者0区的大小
S1C 幸存者1区的大小
S0U 幸存者0区已使用的大小
S1U 幸存者1区已使用的大小
MC 元空间的大小
MU 元空间已使用的大小
OC 老年代的大小
OU 老年代已使用的大小
CCSC 压缩类空间的大小
CCSU 压缩类空间已使用的大小
YGC 从应用程序启动到采样时young gc的次数
YGCT 从应用程序启动到采样时young gc消耗时间(秒)
FGC 从应用程序启动到采样时full gc的次数
FGCT 从应用程序启动到采样时的full gc的消耗时间(秒)
GCT 从应用程序启动到采样时gc的总时间

2.3 总结

  • 如果频繁发生YGC但很少发生FGC,说明在大量创建临时对象,然后又被回收掉了。
  • 如果Old区域使用很高又频繁FGC,那说明内存泄漏了。(注意内存泄漏与内存溢出的区别)

需要更详细的关于JVM的命令可查看我的其他文章,在中有详细的介绍。

3. 堆内存分析

  1. dump内存:使用jmap -dump命令将堆内存给下载出来

  2. MAT分析

    1. 打开Dominator Tree

    2. 分析内存最大对象

image-20240702225650691

堆内存分析的工具有许多,熟悉一个使用即可。

二、总结

内存泄漏情况:一般发生这种,大多数都是因为能存活很久的对象引用了短生命周期的对象,导致短生命周期对象不能及时释放。

内存泄漏:程序在申请内存后,无法释放已经申请的内存。

内存溢出:程序在申请内存的时候,没有足够的内存空间供其使用。

这篇文章还是过于理论,但是博主作为24届毕业生实在没有遇到过线上发生GC的情况,如果遇到了应该也是老员工去处理,下次有幸参与排查的话,再重开一篇文章记录一下真实的GC排查过程。

#Java大厂如何面试##24届秋招同行攻略分享##我的实习求职记录##JVM##牛客在线求职答疑中心#
全部评论
永久代不是变成元空间了么?jstat -gc这一段内容是不是笔误了
点赞 回复 分享
发布于 2024-08-21 11:22 广东

相关推荐

1.自我介绍2.Redis的基本数据类型有哪些3.假设你系统有Redis做缓存,现在突然出现大量短链访问不存在的key,数据库压力暴增。你怎么办4.那这个其实就是穿透对吧?那你打算怎么防?你布隆过滤器放哪一层?你布隆过滤器误判了咋办?误判了是不是得兜底查库?那数据库就又被打爆了呀5. 一个热点数据刚好失效,被几万请求同时打到数据库,这时候你会锁住那个key吗?那锁的粒度是多大?Redis锁?本地锁?锁超时了咋办6.假如Redis故障恢复时间有1分钟,1分钟内所有请求都穿透到数据库,怎么处理7.说一下MySQL吧,MySQL 中有哪些存储引擎?InnoDB和MyISAM的区别?9为什么InnoDB选择B+树作为索引?10.数据库的第三范式?数据库的设计为什么要遵循三范式?11.Spring中处理一个请求,会经过 Spring 的哪些模块去处理12.Spring中的类在它启动之后,会执行哪些方法或者用到哪些注解13.静态代码块和构造方法,哪个先执行?14.构造方法和 Autowried 哪个先执行?15.了解过PostContrust注解吗?这个注解和实现InitializingBean接口重写它的init方法,哪个先执行?16.Java中HashMap和ConcurrentHashMap有什么区别17.什么是一致性哈希?和正常的哈希有什么区别?18.用过哪些设计模式?19.线程的创建方式有哪些?20.实现Runable接口创建线程和实现Callable接口创建线程有什么区别?哪一种接口可以拿到执行的结果?21.一般线程池通过什么方式来创建?线程池有哪些核心参数?22.谈谈线程池工作的流程23.核心线程是一开始就创建了还是任务来了才创建?24.假设一个场景,分别部署了A和B 两个服务,A服务需要调用 B服务,B服务的执行时间比较长。B服务执行完毕后,需要把结果返回给A服务,请你设计解决方法,如何让A和b进行一个交互?(三种方案)25.假如你有两个很大的集合,每个集合本身的数据是不重复的,但是两个集合之间的数据是存在重复的。集合很大,加载到内存中会出现问题,请你从数据结构和算法的角度来考虑,怎么样去找到两个大集合的重复元素26.手撕:(1)力扣 20.有效的括号;(2)手写单例模式27.反问
点赞 评论 收藏
分享
评论
7
53
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务