为何半夜告警电话狂打不停,为何上线用户投诉不断,是道德的沦丧还是人性的扭曲,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让架构师连夜排查解决相关推荐

  1. 大数据、云计算系统高级架构师课程

    大数据.云计算系统高级架构师课程 大数据.云计算系统架构师高级培训课程 链接:https://pan.baidu.com/s/1cfnNqeQ4N3K-_YJAcEEukg 提取码:bhqs

  2. Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题

    写在前面 java内存申请和释放均是由jvm在控制.而释放往往会出现各种各样的问题,经常一个引用没处理好就引起内存泄漏,最后引发OOM.如果发生在重要业务系统还可能出现严重的生产事故. 因此内存使用一 ...

  3. 记录一次大对象导致的Java堆内存溢出问题

    问题描述 前几天早上出现一后台项目无法登陆的情况,排查发现新生代和老年代都占用100%,FullGC次数大概有100多次,最终出现OOM. 重启Tomcat后,至13点,FullGC的次数达到31次. ...

  4. 大数据、云计算系统顶级架构师课程学习路线图

    大数据之Linux+大数据开发篇 Java Linux基础 Shell编程 Hadoop2.x HDFS YARN MapReduce ETL数据清洗Hive Sqoop Flume/Oozie 大数 ...

  5. 大咖们如何评判优秀架构师?

    导语 | 成为一名优秀的架构师是很多开发者的梦想,但对很多人来说却欠缺一条可供参考的实现路径.「云+社区沙龙online」邀请到腾讯云云服务器副总经理李力.贝壳金服小微企业生态CTO&腾讯云最 ...

  6. 大数据、云计算系统高级架构师课程学习路线图

    大数据之Linux+大数据开发篇 大数据的前景和意义也就不言而喻了,未来,大数据能够对大量.动态.能持续的数据,通过运用新系统.新 工具.新模型的挖掘,从而获得具有洞察力和新价值的东西.源于互联网的发 ...

  7. mat查找多线程并发下大对象导致的堆内存问题

    场景代码大概如下: 多线程并发请求接口,接口中的代码首先从guavacache.getIfAbsent()查找对象A,假设本地内存没有,代码又调用fetchFromRedisList获取数据,获取到数 ...

  8. 记一次AD域域管理员密码更改导致某系统群集管理器故障排查解决过程

    环境描述 某公司有一套系统,2台Windows2003系统,采用自带的群集管理器功能实现双机热备功能,正常情况下,服务器10.1.1.1承载中间件应用服务,服务器10.1.1.2承载数据库服务,仅当其 ...

  9. webview显示图片太大,导致webview显示图片还要左右滑动的解决方法

    如图所示是解决好之后的样子 原始代码: string content="<p>IT之家3月15日消息 今日凌晨,苹果公司已宣布其2019年全球开发者大会的日期:<span ...

最新文章

  1. JavaScript模块化 --- Commonjs、AMD、CMD、es6 modules
  2. 初学者用pycharm创建一个django项目和一个app时需要注意的事项
  3. jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7
  4. library的英语怎么读音_【英语角】———学习方法分享
  5. linux 循环缓冲区 源码,Linux中的循环缓冲区
  6. 拓端tecdat|Python中的多项式回归拟合非线性关系实例
  7. 【图像配准】基于matlab OpenSUFT图像配准【含Matlab源码 1232期】
  8. jsp内置对象之request
  9. [XMAN2018排位赛]ppap
  10. 猿创征文 |【算法入门必刷】数据结构-栈(三)
  11. python+selenium环境配置及浏览器调用
  12. 小森生活服务器维护公告,小森生活2021年5月11日停服更新公告
  13. 2022最新影视小程序源码+支持JSON/卡密系统
  14. 数据结构——考前查漏补缺
  15. 描写火车站场景_描写火车站的句子
  16. c++代码实现我的世界
  17. to be continued
  18. 7-33 地下迷宫探索 (30 分)
  19. 2021最新 阿里云服务器免费SSL证书配置方法(图文教程)
  20. java开发实战(4):Springboot工程实现数据库增删改查

热门文章

  1. 天津大学电子海图控件TjuES57Map
  2. c语言around用法,around的用法知识点梳理
  3. Linux中配置Aria2 RPC Server
  4. android pad office,安卓平板电脑也可以使用Office应用了
  5. sql(mysql快捷键)
  6. Boot Option Menu
  7. MOSS系列之五母版页和布局页Featur…
  8. mb_detect_encoding php,php mb_detect_encoding检测字符串编码有误的问题
  9. wps word文档生成目录的时候显示断裂会生成大纲怎么办_自从学会了Word自动排版,我的秀发浓密多了...
  10. 第九届蓝桥杯单片机完整程序