返回顶部
首页 > 资讯 > 精选 >如何解决JVMFullGC引发严重线上事故的问题
  • 465
分享到

如何解决JVMFullGC引发严重线上事故的问题

2023-06-03 08:06:59 465人浏览 独家记忆
摘要

今天就跟大家聊聊有关如何解决JVMFullGC引发严重线上事故的问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、业务场景介绍先简单说说线上生产系统的一个背景,因为仅仅是文章作为

今天就跟大家聊聊有关如何解决JVMFullGC引发严重线上事故的问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一、业务场景介绍

先简单说说线上生产系统的一个背景,因为仅仅是文章作为案例来讲,所以弱化大量的业务背景。

简单来说,这是一套分布式系统,系统A需要将一个非常核心以及关键的数据通过网络请求,传输给另外一个系统B。

所以这里其实就考虑到了一个问题,如果系统A刚刚将核心数据传递给了系统B,结果系统B莫名其妙宕机了,岂不是会导致数据丢失?

所以在这个分布式系统的架构设计中,采取了非常经典的一个Quorum算法

这个算法简单来说,就是系统B必须要部署奇数个节点,比如说至少部署3台机器,或者是5台机器,7台机器,类似这样子。

然后系统A每次传输一个数据给系统,都必须要对系统B部署的全部机器都发送请求,将一份数据传输给系统B部署的所有机器。

要判定系统A对系统B的一次数据写是成功的,要求系统A必须在指定时间范围内对超过Quorum数量的系统B所在机器传输成功。

举个例子,假设系统B部署了3台机器,那么他的Quorum数量就是:3 / 2 + 1 = 2,也就是说系统B的Quorum数量就是:所有机器数量 / 2 + 1。

所以系统A要判定一个核心数据是否写成功,如果系统B一共部署了3台机器的话,那么系统A必须在指定时间内收到2台系统B所在机器返回的写成功的响应。

此时系统A才能认为这条数据对系统B是写成功了。这个就是所谓的Quorum机制。

也就是说,分布式架构下,系统之间传输数据,一个系统要确保自己给另外一个系统传输的数据不会丢失,必须要在指定时间内,收到另外一个系统Quorum(大多数)数量的机器响应说写成功。

这套机制实际上在很多分布式系统、中间件系统中都有非常广泛的使用,我们线上的分布式系统也是采用了这个Quorum机制在两个系统之间传输数据。

给大家上一张图,一起来看一下这套架构长啥样。如何解决JVMFullGC引发严重线上事故的问题

如上图所示,图中很清晰的展示了系统A和系统B之间传输一份数据时的Quorum机制。

接下来,我们用代码给大家展示一下,上面的Quorum写机制在代码层面大概是什么样子的。

PS:因为实际这套机制涉及大量的底层网络传输、通信、容错、优化的东西,所以下面代码经过了大幅度简化,仅仅表达出了一个核心的意思。

如何解决JVMFullGC引发严重线上事故的问题

如何解决JVMFullGC引发严重线上事故的问题

上面就是经过大幅精简后的代码,不过核心的意思是表达清晰了。大家可以仔细看两遍,其实还是很容易弄懂的。

这段代码其实含义很简单,说白了就是异步开启线程发送数据给系统B所有的机器,同时进入一个while循环等待系统B的Quorum数量的机器返回响应结果。

如果超过指定超时时间还没收到预期数量的机器返回结果,那么就判定系统B部署的集群出现故障,接着让系统A直接退出,相当于系统A宕机。

整个代码,就是这么个意思!

二、问题凸现

光是看代码其实没啥难的,但是问题就在于线上运行的时候,可不是跟你写代码的时候想的一样简单。

有一次线上生产系统运行的过程中,整体系统负载都很平稳,本来是不应该有什么问题,但是结果突然收到报警,说系统A突然宕机了。

然后就开始进行排查,左排查右排查,发现系统B集群都好好的,不应该有问题。

然后再查查系统A,发现系统A别的地方也没什么问题。

最后结合系统A自身的日志,以及系统A的JVM FullGC进行垃圾回收的日志,我们才算是搞清楚了具体的故障原因。

三、定位问题

其实原因非常的简单,就是系统A在线上运行一段时间后,会偶发性的进行长时间Stop the World的JVM FullGC,也就是大面积垃圾回收。

但是,此时会造成系统A内部的工作线程大量的卡顿,不再工作。要等JVM FullGC结束之后,工作线程才会恢复运作。

我们来看下面那个代码片段:

如何解决JVMFullGC引发严重线上事故的问题

但是这种系统A的莫名宕机是不正确的,因为如果没有JVM FullGC,本来上面那个if语句是不会成立的。

他会停顿1秒钟进入下一轮while循环,接着就可以收到系统B返回的Quorum数量的结果,这个while循环就可以中断,继续运行了。

结果因为出现了JVM FullGC卡顿了几十秒,导致莫名其妙就触发了if判断的执行,系统A莫名其妙就退出宕机了。

所以,线上JVM FullGC导致的系统长时间卡顿,是造成系统不稳定运行的隐形杀手之一!

四、解决问题

至于上述代码稳定性的优化,也很简单。我们只要在代码里加入一些东西,监控一下上述代码中是否发生了JVM FullGC。

如果发生了JVM FullGC,就自动延长expireTime就可以了。

比如下面代码的改进:

如何解决JVMFullGC引发严重线上事故的问题

通过上述代码的改进,就可以有效的优化线上系统的稳定性,保证其在JVM FullGC发生的情况下,也不会随意出现异常宕机退出的情况了。

看完上述内容,你们对如何解决JVMFullGC引发严重线上事故的问题有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: 如何解决JVMFullGC引发严重线上事故的问题

本文链接: https://lsjlt.com/news/233777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何解决JVMFullGC引发严重线上事故的问题
    今天就跟大家聊聊有关如何解决JVMFullGC引发严重线上事故的问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、业务场景介绍先简单说说线上生产系统的一个背景,因为仅仅是文章作为...
    99+
    2023-06-03
  • 解决SecureRandom.getInstanceStrong()引发的线程阻塞问题
    目录1. 背景介绍2. 现象展示2.1 windows7下运行结果2.2 centos7下运行结果3. 现象分析3.1 linux阻塞分析3.2 windows下运行结果分析4. 结...
    99+
    2024-04-02
  • 如何解决订单号重复引起的事故
    本篇内容介绍了“如何解决订单号重复引起的事故”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们线上出了一次事故,这个事故的表象是这样的:系统...
    99+
    2023-06-16
  • 如何解决因@click.stop引发的bug问题
    这篇文章将为大家详细讲解有关如何解决因@click.stop引发的bug问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题在项目页面中使用 element popov...
    99+
    2024-04-02
  • android.enableD8.desugaring=false引发问题如何解决
    这篇文章主要介绍“android.enableD8.desugaring=false引发问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“android.enableD8.desugarin...
    99+
    2023-07-05
  • 如何解决线上数据库删了的问题
    本篇内容主要讲解“如何解决线上数据库删了的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决线上数据库删了的问题”吧!事件背景MySQL数据库每日零点自...
    99+
    2024-04-02
  • java多线程并发问题如何解决
    在Java中,可以使用以下方法来解决多线程并发问题:1. 使用synchronized关键字:可以通过在方法或代码块前加上synch...
    99+
    2023-09-27
    java
  • redis单线程并发问题如何解决
    Redis是一个单线程的内存数据库,它使用了事件驱动的模型,通过将请求放入一个队列中顺序执行来实现并发处理。但是,在高并发情况下,可...
    99+
    2023-09-11
    redis
  • 如何解决Vue依赖收集引发的问题
    这篇文章主要为大家展示了“如何解决Vue依赖收集引发的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Vue依赖收集引发的问题”这篇文章吧。问题背景在...
    99+
    2024-04-02
  • 如何解决j2Cache线上异常排查问题
    这篇文章主要为大家展示了“如何解决j2Cache线上异常排查问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决j2Cache线上异常排查问题”这篇文章吧。问题背景开发反馈,线上有个服务在...
    99+
    2023-06-29
  • web开发中如何解决自定义事件解决重复请求BUG的问题
    这篇文章将为大家详细讲解有关web开发中如何解决自定义事件解决重复请求BUG的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。BUG的背景最近在开发一个组件,好不容易开...
    99+
    2024-04-02
  • 事件冒泡引发的常见问题与解决方案
    事件冒泡(event bubbling)是指在DOM中,当一个元素上的事件被触发时,它会向上冒泡到该元素的父级元素,再向上冒泡到更高级别的父级元素,直至冒泡到文档的根节点。虽然事件冒泡...
    99+
    2024-02-22
    事件冒泡:事件 问题:冲突 解决方案:停止 事件冒泡 事件捕获
  • 如何解决gearman队列持久化引发的问题
    这篇文章主要讲解了“如何解决gearman队列持久化引发的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决gearman队列持久化引发的问题”吧!具体分析如下:一、gearman ...
    99+
    2023-06-09
  • C#Process的OutputDataReceived事件不触发问题如何解决
    本篇内容介绍了“C#Process的OutputDataReceived事件不触发问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-07-05
  • 如何解决千万级数据表选错索引导致的线上慢查询事故
    这篇文章主要讲解了“如何解决千万级数据表选错索引导致的线上慢查询事故”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决千万级数据表选错索引导致的线上慢查...
    99+
    2024-04-02
  • 如何解决vue项目部署上线遇到的问题
    这篇文章将为大家详细讲解有关如何解决vue项目部署上线遇到的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。流程     1.服...
    99+
    2024-04-02
  • 如何解决React.memo引起的bug问题
    这篇文章主要介绍如何解决React.memo引起的bug问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!与PureComponent不同的是PureComponent只是进行浅对比props来决定是否跳过更新数据这...
    99+
    2023-06-29
  • 如何解决MySQL中因一个双引号错位引发的问题
    小编给大家分享一下如何解决MySQL中因一个双引号错位引发的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言最近经常碰...
    99+
    2024-04-02
  • 如何解决PHP开发中的分布式事务问题
    现如今,随着互联网的快速发展,越来越多的应用程序需要面临分布式事务的挑战。对于PHP开发人员来说,如何解决分布式事务是一个不可回避的问题。本文将介绍一些解决分布式事务问题的常用方法,并提供具体的代码示例。在PHP开发中,分布式事务是指在一个...
    99+
    2023-10-21
    PHP分布式事务解决方案 PHP事务管理 PHP分布式事务处理
  • 如何解决PHP开发中的数据库事务问题
    在PHP开发中,数据库事务是一个常见而重要的主题。事务可以确保一组数据库操作要么全部成功执行,要么全部失败回滚,从而保证数据的一致性和完整性。本文将介绍如何使用PHP进行数据库事务处理,并提供了具体的代码示例。一、什么是数据库事务数据库事务...
    99+
    2023-10-21
    数据库(Database) PHP开发(PHP development) 事务(Transaction)
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作