记一次生产大对象导致的OOM让架构师连夜排查解决
为何半夜告警电话狂打不停,为何上线用户投诉不断,是道德的沦丧还是人性的扭曲,NO,是代码的缺陷。
Java8的JVM内存管理中,大对象生成直接放入老年代的,当老年代空间不足,就会进行FullGC,频繁的生成大对象,会进行频繁的FullGC,甚至直接OOM导致应用宕机。
有时候一段平平无奇的代码,看似温柔,实则暗藏着巨大隐患,这时候算法显得格外的重要,这也是为什么算法是一些大厂招人必备考核项目的原因之一。如何去用最短的时间,最少的空间去使整个产品更加健壮流畅。
在某个场景中需要计算出时长,已知开始时间,结束时间,去除的时间,去除的时间包含多个时间段,比如2019-11-20 00:00:00到2020-12-01 00:00:00,需要去除掉2018-12-20 05:09:00到2019-12-19 09:09:00,2020-04-20 11:00:00到2020-06-23 00:08:00,2020-11-19 00:55:00到2020-12-20 00:00:00,以及2021-12-20 00:00:00到2021-11-19 07:45:00这些时间段,需要计算出在开始和结时间内,除去 需要去除的时间段的秒数,剩余多少秒数。
最初的代码,也就是造成OOM的代码如下,用一个set集合A来保存开始到结束时间内的秒数,用另一个set集合B来保存去除时间段的秒数,然后A除去B中的元素,返回A的size。
看似功能上没啥毛病,但是如果当时长过大的时候,就需要一个很大的数组来存放元素,大对象直接放入老年代,用户量高峰期、后台任务高峰期,就会生成大量的大数组,导致老年代空间不足。
public static int countSecond(long start, long end, List<Map<String, Long>> excludes) {HashSet<Long> seconds = new HashSet<Long>();for(long second=start; second<=end; second++) {seconds.add(second);}HashSet<Long> excludeSeconds = new HashSet<Long>();if(excludes != null && excludes.size()>0) {for (Map<String, Long> exclude : excludes) {Long exStart = exclude.get("start");Long exEnd = exclude.get("end");for (long second = exStart; second <= exEnd; second++) {excludeSeconds.add(second);}}}if(excludeSeconds.size() > 0) seconds.removeAll(excludeSeconds);return seconds.size();}
该代码问题暴露的时间恰巧是半夜凌晨,运维重启无效,告警一直持续,联系到开发定位,定位到该段代码,连夜紧急修复并上线,第一修复版本,先把秒数除以/60,得到分钟数,最后结果再乘*60并返回,这样容量就能够缩小60倍,当时的数据缩小60倍之后,当同样的集群资源下能够正常运行。
public static int countSecond(long start, long end, List<Map<String, Long>> excludes) {HashSet<Long> seconds = new HashSet<Long>();start = start / 60;end = end / 60;for(long second=start; second<=end; second++) {seconds.add(second);}HashSet<Long> excludeSeconds = new HashSet<Long>();if(excludes != null && excludes.size()>0) {for (Map<String, Long> exclude : excludes) {Long exStart = exclude.get("start") / 60;Long exEnd = exclude.get("end") / 60;for (long second = exStart; second <= exEnd; second++) {excludeSeconds.add(second);}}}if(excludeSeconds.size() > 0) seconds.removeAll(excludeSeconds);return seconds.size() * 60;}
其实会发现第一修复版本依然还是会存在OOM的问题的,如果时长足够的话,并且除以60存在精度问题。而且这种算法的空间复杂度和时间复杂度都过于高。
通过相加减的方式直接得出,去除交集即可。
记一次生产大对象导致的OOM让架构师连夜排查解决相关推荐
- 大数据、云计算系统高级架构师课程
大数据.云计算系统高级架构师课程 大数据.云计算系统架构师高级培训课程 链接:https://pan.baidu.com/s/1cfnNqeQ4N3K-_YJAcEEukg 提取码:bhqs
- Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题
写在前面 java内存申请和释放均是由jvm在控制.而释放往往会出现各种各样的问题,经常一个引用没处理好就引起内存泄漏,最后引发OOM.如果发生在重要业务系统还可能出现严重的生产事故. 因此内存使用一 ...
- 记录一次大对象导致的Java堆内存溢出问题
问题描述 前几天早上出现一后台项目无法登陆的情况,排查发现新生代和老年代都占用100%,FullGC次数大概有100多次,最终出现OOM. 重启Tomcat后,至13点,FullGC的次数达到31次. ...
- 大数据、云计算系统顶级架构师课程学习路线图
大数据之Linux+大数据开发篇 Java Linux基础 Shell编程 Hadoop2.x HDFS YARN MapReduce ETL数据清洗Hive Sqoop Flume/Oozie 大数 ...
- 大咖们如何评判优秀架构师?
导语 | 成为一名优秀的架构师是很多开发者的梦想,但对很多人来说却欠缺一条可供参考的实现路径.「云+社区沙龙online」邀请到腾讯云云服务器副总经理李力.贝壳金服小微企业生态CTO&腾讯云最 ...
- 大数据、云计算系统高级架构师课程学习路线图
大数据之Linux+大数据开发篇 大数据的前景和意义也就不言而喻了,未来,大数据能够对大量.动态.能持续的数据,通过运用新系统.新 工具.新模型的挖掘,从而获得具有洞察力和新价值的东西.源于互联网的发 ...
- mat查找多线程并发下大对象导致的堆内存问题
场景代码大概如下: 多线程并发请求接口,接口中的代码首先从guavacache.getIfAbsent()查找对象A,假设本地内存没有,代码又调用fetchFromRedisList获取数据,获取到数 ...
- 记一次AD域域管理员密码更改导致某系统群集管理器故障排查解决过程
环境描述 某公司有一套系统,2台Windows2003系统,采用自带的群集管理器功能实现双机热备功能,正常情况下,服务器10.1.1.1承载中间件应用服务,服务器10.1.1.2承载数据库服务,仅当其 ...
- webview显示图片太大,导致webview显示图片还要左右滑动的解决方法
如图所示是解决好之后的样子 原始代码: string content="<p>IT之家3月15日消息 今日凌晨,苹果公司已宣布其2019年全球开发者大会的日期:<span ...
最新文章
- JavaScript模块化 --- Commonjs、AMD、CMD、es6 modules
- 初学者用pycharm创建一个django项目和一个app时需要注意的事项
- jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7
- library的英语怎么读音_【英语角】———学习方法分享
- linux 循环缓冲区 源码,Linux中的循环缓冲区
- 拓端tecdat|Python中的多项式回归拟合非线性关系实例
- 【图像配准】基于matlab OpenSUFT图像配准【含Matlab源码 1232期】
- jsp内置对象之request
- [XMAN2018排位赛]ppap
- 猿创征文 |【算法入门必刷】数据结构-栈(三)
- python+selenium环境配置及浏览器调用
- 小森生活服务器维护公告,小森生活2021年5月11日停服更新公告
- 2022最新影视小程序源码+支持JSON/卡密系统
- 数据结构——考前查漏补缺
- 描写火车站场景_描写火车站的句子
- c++代码实现我的世界
- to be continued
- 7-33 地下迷宫探索 (30 分)
- 2021最新 阿里云服务器免费SSL证书配置方法(图文教程)
- java开发实战(4):Springboot工程实现数据库增删改查
热门文章
- 天津大学电子海图控件TjuES57Map
- c语言around用法,around的用法知识点梳理
- Linux中配置Aria2 RPC Server
- android pad office,安卓平板电脑也可以使用Office应用了
- sql(mysql快捷键)
- Boot Option Menu
- MOSS系列之五母版页和布局页Featur…
- mb_detect_encoding php,php mb_detect_encoding检测字符串编码有误的问题
- wps word文档生成目录的时候显示断裂会生成大纲怎么办_自从学会了Word自动排版,我的秀发浓密多了...
- 第九届蓝桥杯单片机完整程序