加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

记一次潜匿很深的 JVM 线上惨案的说明、排查、办理

发布时间:2019-09-10 17:11:46 所属栏目:站长百科 来源:Java的小本家
导读:1、本文配景 本文会给各人讲授一个较量非凡的JVM优化案例,这个优化案例自己是由于新手工程师对JVM优化也许相识了一个半吊子,然后不知道从那边找来了一个很黑白凡的JVM参数错误的配置了一下,就导致线上体系频仍的呈现Full GC的题目。 可是我们后续大量的
副问题[/!--empirenews.page--]

 记一次潜匿很深的 JVM 线上惨案的说明、排查、办理

1、本文配景

本文会给各人讲授一个较量非凡的JVM优化案例,这个优化案例自己是由于新手工程师对JVM优化也许相识了一个半吊子,然后不知道从那边找来了一个很黑白凡的JVM参数错误的配置了一下,就导致线上体系频仍的呈现Full GC的题目。

可是我们后续大量的优化案例着实都是各类百般奇形怪状的场景,由于正是各类稀疏场景才气让各人慢慢蕴蓄出来较为富厚的JVM优化拭魅战履历

相识的场景越多,本身将来在处理赏罚JVM机能题目的时辰才气更是驾轻就熟。

2、题目的发生

这个场景的产生大抵如下进程:某天团队里一个新手工程师或许是心血来潮,认为本身网上看到了某个JVM参数,觉得学会了绝世武功秘笈,于是就在当天上线一个体系的时辰,自作主张配置了一个JVM参数

这个参数是什么呢?

不消急,随着看下面的案例说明即可,此刻只要知道他配置了一个稀疏的参数,接着事情就产生了。

由于一样平常中大型公司都是接入相同Zabbix、OpenFalcon可能公司自研的一些监控体系的,监控系同一样平常都做的很好,可以让你的体系直接接入进去,然后在上面可以看到每台呆板的CPU、磁盘、内存、收集的一些负载。

并且可以看到你的JVM的内存行使颠簸折线图,尚有你的JVM GC产生的频率折线图。包罗假如你本身上报某个营业指标,也可以在监控体系里看到。

并且一样平常城市针对线上运行的呆板和体系配置一些报警,好比说,你可以配置假如10分钟内发明一个体系的JVM产生了高出3次Full GC,就必需发送报警给你,可以发送给你的短信、邮箱可能是钉钉之类的IM器材。

相同这样的监控体系不在我们的专栏领域内,提议各人本身可以去查阅资料,着实基于我们讲授的呼吁行器材,好比jstat,你可以通过linux上的一些呼吁,让jstat自动对jvm举办监控,把监控功效可以输出到呆板的某个文件里去。

然后第二天你就可以去查阅谁人文件,也可以看到那台呆板的jvm的一些gc统计。

以是说,没有可视化器材,用最简朴的呼吁行器材,着实同样可以起到相同的结果。

以是那天谁人工程师配置了一个JVM参数之后,直接导致线上频仍接到JVM的Full GC的报警,各人就很稀疏了,于是就开始排查谁人辖档退。

3、查察GC日记

之前已经给各人讲授过如安在启动体系的时辰让他输出GC日记,以是一旦发明报警,直接登录到线上呆板,然后就看到对应的GC日记了。

此时我们看到在GC日记中有大量的Full GC的记录。

那么是为什么导致的Full GC呢?

在日记里,看到了一个“Metadata GC Threshold”的字样,相同于如下日记:

【Full GC(Metadata GC Threshold)xxxxx, xxxxx】

从这里就知道,这频仍的Full GC,现实上是JDK 1.8往后的Metadata元数据区导致的,也就是相同我们之前说的永世代。

这个Metadata地区一样平常是放一些加载到JVM里去的类的。

以是此时就很稀疏了,为什么会由于Metadata地区频仍的被塞满,进而触发Full GC?并且Full GC各人都知道,会发动CMS接纳晚年月,还会接纳Metadata地区自己。

我们先看看下图:

记一次潜匿很深的 JVM 线上惨案的说明、排查、办理

4、查察Metaspace内存占用环境

接着我们虽然是想看一看Metaspace地区的内存占用环境了,简朴点你可以通过jstat来调查,假若有监控体系,他会给你展示出来一个Metaspace内存地区占用的颠簸曲线图,相同下面这种。

记一次潜匿很深的 JVM 线上惨案的说明、排查、办理

看起来Metaspace地区的内存泛起一个颠簸的状态,他老是会先不绝增进,到达一个极点之后,就会把Metaspace地区给占满,然后天然就会触发一次Full GC,Full GC会带着Metaspace地区的垃圾接纳,以是接下来Metaspace地区的内存占用又变得很小了。

5、一个综合性的说明思绪

看到这里,信托各人必定有一点感受了,这个很明明是体系在运行进程中,不断的有新的类发生被加载到Metaspace地区里去,然后不断的把Metaspace地区占满,接着触发一次Full GC接纳掉Metaspace地区中的部门类。

然后这个进程重复的不绝的轮回,进而造成Metaspace地区重复被占满,然后重复导致Full GC的产生,如下图所示。

记一次潜匿很深的 JVM 线上惨案的说明、排查、办理

6、到底是什么类不断的被加载?

接着我们就有点稀疏了,到底是什么类不断的被加载到JVM的Metaspace地区里去?

这个时辰就必要在JVM启动参数中插手如下两个参数了:

  1. “-XX:TraceClassLoading -XX:TraceClassUnloading” 

这两个参数,顾名思义,就是追踪类加载和类卸载的环境,他会通过日记打印出来JVM中加载了哪些类,卸载了哪些类。

插手这两个参数之后,我们就可以看到在Tomcat的catalina.out日记文件中,输出了一堆日记,内里表现相同如下的内容:

【Loaded sun.reflect.GeneratedSerializationConstructorAccessor from __JVM_Defined_Class】

明明可以看到,JVM在运行时代不断的加载了大量的所谓“GeneratedSerializationConstructorAccessor”类到了Metaspace地区里去

如下图所示

记一次潜匿很深的 JVM 线上惨案的说明、排查、办理

信托就是由于JVM运行时代不断的加载这种稀疏的类,然后不断的把Metaspace地区占满,才会激发不断的执行Full GC的。

这是一个很是适用的能力,列位同窗必然要把握,频仍Full GC不仅是晚年月触发的,偶然辰也会由于Metaspace地区的类太多而触发。

到此为止,已经逐步靠近实情了。

7、为什么会频仍加载稀疏的类?

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读