如何排查线上系统出现的Full GC

目录

[1、了解有哪些可能原因导致Full GC?](#1、了解有哪些可能原因导致Full GC?)

2、排查问题时能使用哪些工具

3、排查基本流程


笔者在工作期间,曾经负责上千台服务器的管理,承接支付系统干万级TPS的实时数据处理,有一次某功能发布上线后,导致每天10点准时出现近一半的机器出现Full GC,导致数据处理积压严重,严重影响下游业务正常处理。

上面向题基本排查思路:在Full GC之前,通过内存快照查看是否存在异常的大对象,并且最好能dump下内存详细数据,然后通过jmap或者其他内存泄漏分析工具进行查看,定位可能出现泄露的对象,然后定位变更代码的位置,最后关闭变更的功能。

但是,这个FGC出现的原因是多种多样的,下面讲述常规排查方法。

1、了解有哪些可能原因导致Full GC?

(1) 大对象 :系统一次性加载了过多数据到内存中(比如SQL查询未做分页),导致

大对象进入了老年代。

(2) 内存泄漏 :频繁创建了大量对象,但是无法被回收(比如10对象使)用完后未调用

close方法释放资源),先引发Full GC,最后导致OOM.

(3) 程序频繁生成一些长生命周期的对象, 当这些对象的存活年龄超过分代年龄时便

会进入老年代,最后引发Full GC.(即本文中的案例)

(4) 程序BUG导致动态生成了很多新类 ,使得原空间Metaspace不断被占用,先引发Full GC

最后导致OOM.

(5) JVM参数设置问题 :包括总内存大小、新生代和老年代的大小、Eden区和S区福

大小、元空间大小、垃圾回收算法等等。

2、排查问题时能使用哪些工具

公司的监控系统:大部分公司都会有,可全方位监控JVM的各项指标。

JDK的自带工具,包括jmap、jstat等常用命令

#查看堆内存各区域的使用率以及GC情况

jstat-gcutil-h20pid 1000

#查看堆内存中的存活对象,并按空间排序

jmap-histo pid head-n20

#dump堆内存文件

jmap-dump:format=b.file=heap pid

可视化的堆内存分析工具,JVisualVM、MAT等

3、排查基本流程

(1)查看监控 ,了解出现问题的时间点以及当前Full GC的频率(可对比正常情况看频率是否正常)

(2) 了解该时间点之前有没有程序上线、基础组件升级等情况。

(3) 了解JVM的参数设置 ,包括:堆空间各个区域的大小设置,新生代和老年代分别采用了哪些垃圾收集器,然后分析JVM参数设置是否合理。

(4) 再对步骤 1 中列出的可能原因做排除法,其中元空间被打满、内存泄漏代码显式调用gc方法比较容易排查。

(5) 针对大对象或者长生命周期对象导致的Full GC,可通过jmap-histo 命令并结合 dump 堆内存文件作进一步分析,需要先定位到可疑对象。

(6) 通过可疑对象定位到具体代码再次分析,这时候要结合GC原理和JVM参数设置,弄清楚可疑对象是否满足了进入到老年代的条件才能下结论。

相关推荐
日月星辰Ace1 天前
Java JVM 浅显理解
java·jvm
心月狐的流火号1 天前
JVM类生命周期深度解析:从加载到卸载
jvm
日月星辰Ace2 天前
Java JVM 垃圾回收器(四):现代垃圾回收器 之 Shenandoah GC
java·jvm
yaoxin5211232 天前
105. Java 继承 - 静态方法的隐藏
java·开发语言·jvm
LUCIAZZZ2 天前
项目拓展-Apache对象池,对象池思想结合ThreadLocal复用日志对象
java·jvm·数据库·spring·apache·springboot
日月星辰Ace2 天前
Java JVM 垃圾回收器(三):现代垃圾回收器 之 ZGC
java·jvm
float_六七2 天前
深入解析JVM类加载机制
jvm
kfyty7252 天前
轻量级 ioc 框架 loveqq,支持接口上传 jar 格式的 starter 启动器并支持热加载其中的 bean
java·jvm·ioc·jar·热加载
float_六七2 天前
深入解析JVM字节码执行引擎
jvm
LUCIAZZZ2 天前
钉钉机器人-自定义卡片推送快速入门
java·jvm·spring boot·机器人·钉钉·springboot