天天看点

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

前言

这是 JVM 系列文章的第一篇。说明一下 GC 的重要性。

故障描述

某年某月某日 上午,线上发生故障,经过排查,发现某核心服务 Dubbo 接口超时。

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

故障根源

查看该服务监控指标,发现该服务 FullGC 次数过于频繁,简直要飞上天了。那也难怪接口会超时了。

那么为啥 FullGC 次数太多会造成接口超时呢?

因为 GC 停顿。 FullGC 时会产生GC停顿,也叫 stop the world。简称 STW ,是指在执行垃圾收集算法时,用户线程都被挂起。这也不难理解为啥 频繁 FullGC 会引起服务超时了。

深入探究

那么为什么会引起频繁FullGC 呢?

回答这个问题之前,先了解下,有哪些情况会触发 Full GC ?

  1. 老年代内存空间不足时,会触发 FullGC.
  2. 永久代/metaspace 内存空间不足时,也会触发FullGC.
  3. 显示调用 GC,System.gc.(会建议jvm GC,但是不一定会GC).

产生 FullGC 的基本原因就上面三种。

故障服务就是创建很多对象,无法回收,导致内存不足,然后 GC 回收不了时,就会引起频繁 FullGC 了。

复现故障

根据内存不足创建对象会引起 FullGC 的原理,写了一个 Demo ,观察GC 情况。

代码如下:

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

代码很简单,就是让上次创建的对象可以被回收,然后继续创建对象,然后链接到根结点,使其不会被回收。(demo 地址https://github.com/caofangqi/demo-java/tree/master/jvm/demo-gc)

使用启动参数 -Xms512m -Xmx512m 设置堆内存大小。

启动 Demo ,然后发起请求,观察GC 情况。

首先,使用命令 jps -l 查看进程ID

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

然后使用 jstat 命令查看GC信息(jstat 命令详解:https://blog.csdn.net/weixin_39913200/article/details/81147535)

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

上图可以看到 正在不停的进行 Full GC.

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

上图可以看出,老年代,以及元数据区 内存空间已满,这也是 不停 Full GC 的原因。

再看我发出的请求:

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

过去这么久,依然没有结果。

使用 jstack 命令查看 线程状态,发现 用户线程已经被挂起。

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

不难看出,频繁的 FullGC 已经影响到了应用的正常运行。

结束语

了解 JVM 还是很有必要的。CURD 时不觉得,遇上问题时就可以大展身手了。本文只是简单的描述了一下频繁 FullGC 会引起的问题。后续准备从基础的内存结构写起,输出系列文章。方便别人的同时,也是对自己知识的梳理。

———— e n d ————

快年底了,师长为大家准备了三份面试宝典:

《java面试宝典5.0》

《350道Java面试题:整理自100+公司》

《资深java面试宝典-视频版》

分别适用于初中级,中高级,以及资深级工程师的面试复习。

内容包含java基础、javaweb、各个性能优化、JVM、锁、高并发、反射、Spring原理、微服务、Zookeeper、数据库、数据结构、限流熔断降级等等。

一、初中级《java面试宝典5.0》,对标8-13K

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

二、中高级《350道Java面试题:整理自100+公司》,对标12-20K

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?

三、资深《java面试突击-视频版》,对标20K+

gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?
gc的原因 频繁full_「原创」JVM01 | GC这么好,做了什么频繁引起服务超时?