一次线上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% .如何排查的呢 是通过 ...
随机推荐
- 2017-2018-2 165X 『Java程序设计』课程 助教总结
2017-2018-2 165X 『Java程序设计』课程 助教总结 本学期完成的助教工作主要包括: 编写300道左右测试题,用于蓝墨云课下测试: 发布博客三篇:<2017-2018-2 165 ...
- pl/sql Devloper 关键字转为大写
英文版: peferences-editor-keyword case -uppercase 中文版:
- window系列
1.关闭浏览器单个网页 ctrl+W 2.远程桌面连接 mstsc
- win7下出现读不到移动硬盘的解决办法
很多电脑会出现移动硬盘读不到,或者 读到部分盘的情况,那么下面我就为大家来一一解决这些情况: 方法一: 最常见的是硬盘供电不足导致 ,要么换一个硬盘盒子,要么给硬盘一个外加电源即可方法二: ...
- linux中fork()函数详解【转】
转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过 ...
- MySQL版本升级参考资料【转】
MySQL升级参考资料 MySQL 升级的最佳实践 - 技术翻译 - 开源中国社区https://www.oschina.net/translate/mysql-upgrade-best-practi ...
- ES系列一、CentOS7安装ES 6.3.1、集成IK分词器
Elasticsearch 6.3.1 地址: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3. ...
- 一步步实现windows版ijkplayer系列文章之七——终结篇(附源码)
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- Android:Service
Android Service: http://www.apkbus.com/android-15649-1-1.html android service 的各种用法(IPC.AIDL): http: ...
- PHP获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址
声明转换于其它博客当中的. <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $ ...