​ 标题采自:英雄联盟-瑞文:断剑重铸之日,骑士归来之时!

断剑

​ 前两天早上在挤地铁的时候看到小组群里,主管发了好多消息,打开来一看,说是XX项目自从22号发版后,每天晚上就疯狂Full GC,让我们查一下什么原因,嘻嘻嘻,一开始听到,心里窃喜,为什么呢。因为自己以前对jvm也有些了解,不过都只是纸上谈兵罢了。现在刚好有机会,到公司就和小伙伴开始排查。以下是full gc的图片

​ 图 - 1.0



​ 图 - 2.0

​ 图 - 3.0

​ 当然这是运维给出来的,一开始看到这个,我是懵逼的,这tm是什么。接着往下看:运维又给出了如下图的dump日志

​ 图- 4.0

​ 我心里又问,这tm是什么。哇,一脸懵逼的我,又去补了jvm的内存模型。

重铸

​ 就在我补给的时候,有个大佬已经发言了,

​ 图 -5.0

​ 是不是感觉找到问题的来源了,就这有结束了,嘻嘻嘻。然后心里一阵窃喜,还好是老代码。不是我写的。但是事实却没有结束,为什么了。接着往下看:

​ 又一位大佬说:图-6.0 应该就是这块了

​ 图- 6.0

​ 主管又说:虽然是老代码,但是以前没发生过这样的问题,但是自从22号发版后就开始了,她就查看了一下22号有关AssostantsDto 这块有关的代码,并截图发了出来



​ 图-7.0

​ 看到发出来的这段,上面有我的署名 ouyangkang modify,我先是脸部发烫,然后大脑空白,接着回魂。我????? 写的。emmmm............。有点印象,这段代码有问题?看下绿色的那段我改的代码,

首先获取到一个list对象,遍历该list,给list容器中的对象赋值,并重新把该对象添加list容器中,乍看一下,没问题啊,这段代码。emm............................

仔细再看下绿色的那段我改的代码:

首先获取到一个list对象,遍历该list,给list容器中的对象赋值,并重新把该对象添加list容器中。等等,重新添加到list容器中,那么该list容器的大小不就也更大吗,那么又会进行一次循环,这不发生了死循环吗。哇!! 这就很有意思了,我的锅,我的锅。

那么怎么改呢:

第一种方案:直接去掉list.add(i,assistantsDto)。因为你堆list中的对象写入内容的话,list中的对象引用的地址是不会改变的。

第二种方案:list.set(i,assistantsDto) 将改dto替换。

项目重新发版,果然这几天xx项目再也没有出现频繁的Full GC了。

之日

图-2.0 解释

​ 解释断剑中图中含义:如果能够看懂前面几张图的这节就可以跳过了。图1.0就不解释了,首先图-2.0中第一行

60208.152(时间戳),[Full GC(Ergonomics)(解释:发生了什么GC)4035169K(解释:jvm堆中内存已用大小)->3635904(解释:经过full gc回收堆中内存后,堆中还剩余的内存大小) (4178944K(解释:jvm堆的总内存大小))]

从图-1.0 中可以看出,经过一个full gc后,堆中可用内存还是不多,并且发生了很多次full gc。我们都知道full gc就是stop the word 连续的full gc 。那么就导致这个项目不再对外提供服务了。

GC 策略

​ 大概说一下GC有哪几种回收策略,详情网上都有,自行查看,我就不写了(偷懒),算了,我还是写了点。

​ minor GC: 发生在年轻代。

​ 一开始:当eden区对象写满的时候,发生minor GC,把存活对象放到S0,释放其他对象所占内存,继续运行,eden区又写满了,发生minor GC,回收eden区和S0区存活对象,把存活对象防止S1,释放其他对象所占内存。eden区又写满了,发生minor GC,回收eden区和S1区存活对象,把存活对象防止S0,释放其他对象所占内存。反反复复,比较老一点的对象就放到了老年代。

​ major GC:发生在老年代:eg: 当发生minor GC 的时候,想把存活的老对象放到老年代,但是没有这么大的连续内存空间,此时就会发生major GC

​ full GC: 发生在年轻代和老年代 : eg: 当老年代和新生代内存都写的快满了的时候就会发生full GC|

JVM内存模型

​ 大概说一下JVM内存模型:下次写篇blog单独介绍一下吧 。先欠着

图-3.0 解释

​ 我截取部分进行解释:

S0C :Survivor0 可用内存大小 。 S1C: Survivor1可用内存大小

S0U:Survivor0 已用内存大小 S1U :Survivor1已用内存大小

EC: eden可用内存大小 EU:eden 已用内存大小

OC: 老年代可用内存大小 OU:老年代已用内存大小

MC:方法区可用内存大小 MU:方法区已用内存大小

CCSC :压缩类空间内存大小 CCSU:压缩类空间已用内存带下

YGC: 年轻代垃圾回收次数 YGCT:young GC消耗的时间

FGC:full GC 回收次数 FGC:full GC 消耗的时间

GCT : GC 消耗的时间

图-4.0 解释

​ 用mat工具打开jump文件所得到的,首先网上下载 mat,选择适合你电脑系统的。至于怎么操作,下次单独拎出来介绍。

其实我还研究了一点jvm虚拟机参数设置,GC日志打印,本地线程监控,我想留到下一篇博客再介绍吧。谢谢

如果我不写骑士归来之时,强迫症是不是会很难受。那么就推荐一下,留个言,我大声讲出来。

一次线上FullGC问题记录的更多相关文章

  1. 记一次令人窒息的线上fullgc调优

    今天第二篇采坑了... ... 现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节 情况是一台服务器一启动就开始full gc,短短1分钟可以有几 ...

  2. HTTPS从认识到线上实战全记录

    前言 关于HTTPS,基本上你想知道的都在这里了.本文原标题<HTTPS原理与实践>,下图是本文配套PPT的目录截图: [TOC] 原理篇 认识HTTPS 先说一下,本文可能有些地方由于描 ...

  3. web_一些常用的线上脚本地址记录(个人使用)

    1.jquery <script src="http://code.jquery.com/jquery-1.4.1.min.js"></script> 2. ...

  4. nmap扫描端口导致线上大量Java服务FullGC甚至OOM

    nmap扫描端口导致线上大量Java服务FullGC甚至OOM 最近公司遇到了一次诡异的线上FullGC保障,多个服务几乎所有的实例集中报FullGC,个别实例甚至出现了OOM,直接被docker杀掉 ...

  5. 删除heroku上的数据库记录

    部署本地项目到heroku上.在线上插入数据到数据库,本地代码再次更新到heroku,线上的数据记录还存在单是图片丢失.问题还没有解决: 本地代码和heroku代码怎样同步? heroku使用的pg和 ...

  6. 关于GC(上):Apache的POI组件导致线上频繁FullGC问题排查及处理全过程

    某线上应用在进行查询结果导出Excel时,大概率出现持续的FullGC.解决这个问题时,记录了一下整个的流程,也可以作为一般性的FullGC问题排查指导. 1. 生成dump文件 为了定位FullGC ...

  7. 记录一次linux线上服务器被黑事件

    1.原因:本来在家正常休息了,我们放在上海托管机房的线上服务器突然蹦了远程不了,服务启动不了,然后让上海机房重启了一次,还是直接挂了,一直到我远程上才行. 2.现象:远程服务器发现出现这类信息 Hi, ...

  8. 一次线上Mysql数据库崩溃事故的记录

    文章简介 工作这几年,技术栈在不断更新,项目管理心得也增加了不少,写代码的速度也在提升,感觉很欣慰,毕竟是在一直进步,但是过程中也有许许多多的曲折,也踩过了数不尽的坑坑洼洼,从一个连百度都不知道用的萌 ...

  9. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

随机推荐

  1. 电子邮件和URL输入控件

    HTML5还引入了让用户输入邮箱地址和URL的输入控件.那些不支持这类输入控件的浏览器会把他们当成普通文本框来处理. <!DOCTYPE html> <!-- To change t ...

  2. [转]C++赋值运算符重载函数(operator=)

    写在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是,内容大多雷同且不全面.面对这一局面,在下在整合各种资源及融入个人理解的基础上,整理出一篇较 ...

  3. Windows和Mac上NodeJS和Express的安装

    一.安装NodeJS,官网上下载,https://nodejs.org/en/ 直接下一步安装就行了. 打开命令行工具,输入 node -v 则会出现node的版本,则成功了. 下面我们介绍如何安装e ...

  4. python2和3使用pip时的问题

    win10,电脑之前装有Anaconda,python2.因为需要用到python3,所以直接下载安装了python3.python3默认路径在c盘.我将其移到D盘并修改了两个环境变量.这时电脑的默认 ...

  5. windows使用python原生组件包获取系统日志信息

    #coding=utf8 import sys import traceback import win32con import win32evtlog import win32evtlogutil i ...

  6. 编写html与js交互网页心得:编写两个按钮切换显示不同的图片

    第一步:先建立一个html网页,如下: <!DOCTYPE html><html> <head>  <meta charset="utf-8&quo ...

  7. C/C++:函数调用规则__stdcall,__cdecl,__pascal,__fastcall

    __cdecl __cdecl 是 C Declaration  的缩写,表示 C 语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用函数不会要求调用者传递多 ...

  8. javascript 搞不清原型链和constructor

    prototype.constructor仅仅可以用于识别对象是由哪个构造函数初始化的,仅此而已. var one=new Person(‘js’); 要解释这个结果就要仔细研究一下new这个操作符了 ...

  9. Json学习整理

    1:javascript对JSON的支持 2:java对JSON的支持 alibaba->fastjson 封装工具类: import com.alibaba.fastjson.JSONObje ...

  10. [工具/PC]计算机中丢失libiconv-2.dll,丢失libintl-8.dll,无法定位程序输入点libiconv于动态链接库libiconv-2.dll上问题解决方法

    CodeBlocks 1. 背景,为了学习C语言,在win系统上下载了codeBlock,先简单介绍下:Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. Code::B ...