如何排查线上系统出现的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参数设置,弄清楚可疑对象是否满足了进入到老年代的条件才能下结论。

相关推荐
找不到、了3 小时前
JVM核心知识整理《1》
jvm
L.EscaRC4 小时前
面向 Spring Boot 的 JVM 深度解析
jvm·spring boot·后端
学到头秃的suhian21 小时前
JVM-类加载机制
java·jvm
NEFU AB-IN1 天前
Prompt Gen Desktop 管理和迭代你的 Prompt!
java·jvm·prompt
唐古乌梁海1 天前
【Java】JVM 内存区域划分
java·开发语言·jvm
众俗1 天前
JVM整理
jvm
echoyu.1 天前
java源代码、字节码、jvm、jit、aot的关系
java·开发语言·jvm·八股
代码栈上的思考2 天前
JVM中内存管理的策略
java·jvm
thginWalker2 天前
深入浅出 Java 虚拟机之进阶部分
jvm
沐浴露z2 天前
【JVM】详解 线程与协程
java·jvm