一次线上FullGC问题记录
标题采自:英雄联盟-瑞文:断剑重铸之日,骑士归来之时!
断剑
前两天早上在挤地铁的时候看到小组群里,主管发了好多消息,打开来一看,说是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问题记录的更多相关文章
- 记一次令人窒息的线上fullgc调优
今天第二篇采坑了... ... 现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节 情况是一台服务器一启动就开始full gc,短短1分钟可以有几 ...
- HTTPS从认识到线上实战全记录
前言 关于HTTPS,基本上你想知道的都在这里了.本文原标题<HTTPS原理与实践>,下图是本文配套PPT的目录截图: [TOC] 原理篇 认识HTTPS 先说一下,本文可能有些地方由于描 ...
- web_一些常用的线上脚本地址记录(个人使用)
1.jquery <script src="http://code.jquery.com/jquery-1.4.1.min.js"></script> 2. ...
- nmap扫描端口导致线上大量Java服务FullGC甚至OOM
nmap扫描端口导致线上大量Java服务FullGC甚至OOM 最近公司遇到了一次诡异的线上FullGC保障,多个服务几乎所有的实例集中报FullGC,个别实例甚至出现了OOM,直接被docker杀掉 ...
- 删除heroku上的数据库记录
部署本地项目到heroku上.在线上插入数据到数据库,本地代码再次更新到heroku,线上的数据记录还存在单是图片丢失.问题还没有解决: 本地代码和heroku代码怎样同步? heroku使用的pg和 ...
- 关于GC(上):Apache的POI组件导致线上频繁FullGC问题排查及处理全过程
某线上应用在进行查询结果导出Excel时,大概率出现持续的FullGC.解决这个问题时,记录了一下整个的流程,也可以作为一般性的FullGC问题排查指导. 1. 生成dump文件 为了定位FullGC ...
- 记录一次linux线上服务器被黑事件
1.原因:本来在家正常休息了,我们放在上海托管机房的线上服务器突然蹦了远程不了,服务启动不了,然后让上海机房重启了一次,还是直接挂了,一直到我远程上才行. 2.现象:远程服务器发现出现这类信息 Hi, ...
- 一次线上Mysql数据库崩溃事故的记录
文章简介 工作这几年,技术栈在不断更新,项目管理心得也增加了不少,写代码的速度也在提升,感觉很欣慰,毕竟是在一直进步,但是过程中也有许许多多的曲折,也踩过了数不尽的坑坑洼洼,从一个连百度都不知道用的萌 ...
- Linux(2)---记录一次线上服务 CPU 100%的排查过程
Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...
随机推荐
- bootstrap-table前端修改数据
使用bootstrap-table显示数据,后台传回数据以后,可能需要对其做调整,如需要前端为数据添加单位 调整数据代码 $("#"+tableId).bootstrapTable ...
- java删除文件及其目录
1.删除指定文件路径 public @ResponseBody String deleteFiles(HttpServletRequest request) { log.info(this.getCl ...
- android view绘制流程 面试
一.view树的绘制流程 measure--->layout--->draw measure 1.ViewGroup.LayoutParams 指定部件的长宽 2.MeasureSpec ...
- Python中的元类
从前面"Python对象"文章中了解到,在Python中一切都是对象,类可以创建实例对象,但是类本身也是对象. class C(object): pass c = C() prin ...
- oracle删除表字段和oracle表增加字段
这篇文章主要介绍了oracle表增加字段.删除表字段修改表字段的使用方法,大家参考使用吧 添加字段的语法:alter table tablename add (column datatype [d ...
- sqlserver2008r2实现镜像
拓扑图 环境 主服务器: 192.168.8.16 winserver2008b 镜像服务器 192.168.11.128 mssql1 见证服务器: 192.168.8.69 server2008c ...
- HTML常用特殊字符
网页特殊符号HTML代码大全 HTML特殊字符编码大全:往网页中输入特殊字符,需在html代码中加入以&开头的字母组合或以&#开头的数字.下面就是以字母或数字表示的特殊符号大全. ...
- totastmessage 触发事件后浮框消失的方法
1. 前言 通过查了官放的文档,发现没有 totastmessage 触发事件后,浮框消失的方法,然后通过研究了下点击关闭时的源码,得到了一个的解决方案. 2. 样例代码如下 $("#dro ...
- urllib处理包的简单使用
我们可以使用urllib.request.urlopen()这个接口函数就可以打开一个网站,读取打印信息 你可以现在终端使用python from urllib import request if _ ...
- asp.net core 2.0 api ajax跨域问题
API配置: services.AddCors(options => { options.AddPolicy("any", builder => { builder.W ...