游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

记一次内存泄漏引发的生产事故

  头条创作挑战赛概述
  本篇文章主要记录在生产环境上发生了内存泄漏导致系统OOM,造成了严重的后果,以致于本人吃土一个月,5555本文主要对该问题做一个复盘,同时分析下什么是内存泄漏,如何识别你的系统中存在潜在可能的内存泄漏风险,并且哪些常见的场景可能会引发内存泄漏,需要引起我们特别注意。事件回顾事故背景
  某商业银行项目上部署了我们的风控系统,其中一个节点挂了,同时报了OOM的错误,还好其他节点正常work,不然本人要吃土一整年了,第二天本人就被要求出差到现场分析解决该问题。事故排查和修复
  通过dump生成的堆信息,用jprofiler(后面专门出文章介绍使用)工具发现:
  上面这个字符串对象特别多,几十万个,占用了大量的堆空间,根据这个字符串查询,发现是其他同事的代码中监控项使用不当导致。
  代码
  原因分析
  监控项的tag值要求是可枚举的,不能生成的每条tag都是唯一的,这样应用不会覆盖,而是保留每一条数据,导致内存爆炸。
  而这里的succList,是一个Set对象,虽然列表数量是确定的,但是每次请求过来顺序不一致,比如succList有10个对象,那么就会有10!种可能,最终撑爆内存。
  修复方案
  遍历succList,tag使用单条数据,而不是把整个对象列表放进去,重新上线后监测,没有出现问题。
  小结
  因为监控项使用不当导致内存泄漏,最终导致OOM。其实内部复盘了下,主要开发人员对监控项不大会使用,对里面的底层原理也不甚了解,所以了解一个技术的底层实现还是非常重要的。而且,团队内部也缺少代码review,缺少生产级别数据的验证,一系列原因,最终导致出现该生产问题。什么是内存泄漏
  通俗的来说,内存泄漏就是占着茅坑不拉屎,你认为该对象用不上了,但是实际上还被程序使用,GC又无法回收,这种情况就是内存泄漏。
  如何对象判断是否还在被程序使用呢?
  GC的可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)。
  内存泄漏和内存溢出
  内存泄漏(MemoryLeak)最终的后果会导致内存溢出(OutOfMemory),但是内存溢出并不完全是内存泄漏导致,也有可能分配了一个大对象,数据库未分页查全量的数据等等。如何发现存在内存泄漏
  更关键的是我们应该如何提前发现我们的系统存在潜在的内存泄漏风险,从而规避生产出现OOM问题?测试环境模拟测试,开启GC日志输出到文件里通过GCEasy工具分析日志,观察下每次垃圾回收后,它的内存使用情况如果发现回收完后,堆占用是递增的趋势,那么很有可能有内存泄漏的问题。
  此外,大家还可以使用EclipseMemoryAnalyzer、JProbeProfiler、JVisualVM等工具分析程序的内存信息,凭借个人经验判断是否有内存泄漏问题(说了个寂寞,哈哈哈)。内存泄漏的几种常见场景
  下面通过几个案例带大家了解下常见的几种内存泄漏的场景,如果大家的程序中有类似的场景,那么就要特别注意了。静态字段
  可能导致潜在内存泄漏的第一种情况是大量使用静态变量。在Java中,静态字段的生命周期通常与应用程序一样。
  简单而言,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。publicclassMemoryLeak{staticListlistnewArrayList();publicvoidoomTests(){ObjectobjnewObject();局部变量list。add(obj);}}复制代码
  如何避免:最大限度地减少静态变量的使用使用单例时,依赖于延迟加载对象而不是急切加载的实现未关闭的连接池资源
  在对数据库进行操作的过程中,首先需要建立与数据库的连接,当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。否则,如果在访问数据库的过程中,对Connection、Statement或ResultSet不显性地关闭,将会造成大量的对象无法被回收,从而引起内存泄漏。publicstaticvoidmain(String〔〕args){try{Connectionconnnull;Class。forName(com。mysql。jdbc。Driver);connDriverManager。getConnection(url,,);Statementstmtconn。createStatement();ResultSetrsstmt。executeQuery(。。。。);}catch(Exceptione){异常ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a}finally{1关闭结果集Statement2关闭声明的对象ResultSet3关闭连接Connection}}复制代码
  如何避免:始终使用finally块来关闭资源可以用sonar等工具检查代码改变哈希值
  改变哈希值,当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了。
  否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄漏。
  这也是String为什么被设置成了不可变类型,我们可以放心地把String存入HashSet,或者把String当做HashMap的key值;
  当我们想把自己定义的类保存到散列表的时候,需要保证对象的hashCode不可变。publicclassChangeHashCode1{publicstaticvoidmain(String〔〕args){HashSetPointhsnewHashSetPoint();PointccnewPoint();cc。setX(10);hashCode41hs。add(cc);cc。setX(20);hashCode51此行为导致了内存的泄漏System。out。println(hs。removehs。remove(cc));falsehs。add(cc);System。out。println(hs。sizehs。size());size2System。out。println(hs);}}classPoint{intx;publicintgetX(){returnx;}publicvoidsetX(intx){this。xx;}OverridepublicinthashCode(){finalintprime31;intresult1;resultprimeresultx;returnresult;}Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj。getClass())returnfalse;Pointother(Point)obj;if(x!other。x)returnfalse;returntrue;}OverridepublicStringtoString(){returnPoint{xx};}}复制代码
  如何避免:自己写的对象要重写hashCode和equals方法对象被加入到HashSet、HashMap等容器后,尽量避免修改。引用外类的内部类
  默认情况下,每个非静态内部类都包含对其外部类的隐式引用。如果我们在应用程序中使用这个内部类对象,那么即使在我们的外部类对象不再使用了,它也不会被垃圾收集。因为内部类对象隐式地保存对外部类对象的引用,从而使其成为垃圾收集的无效候选者。在匿名类的情况下也是如此。
  如何避免如果内部类不需要访问当前包含这个内部类的父类的成员时,请考虑将其转换为静态类
  ThreadLocal使用不当
  ThreadLocal使我们能够将状态隔离到特定线程,从而允许我们实现线程安全。
  一旦保持线程不再存在,ThreadLocals应该被垃圾收集。是当ThreadLocals与现代应用程序服务器一起使用时,问题就出现了。现代应用程序服务器使用线程池来处理请求而不是创建新请求(例如,在ApacheTomcat的情况下为Executor)。此外,他们还使用单独的类加载器。由于应用程序服务器中的线程池在线程重用的概念上工作,因此它们永远不会被垃圾收集相反,它们会被重用来处理另一个请求。现在,如果任何类创建ThreadLocal变量但未显式删除它,则即使在Web应用程序停止后,该对象的副本仍将保留在工作线程中,从而防止对象被垃圾回收。
  如何避免最好手动调用ThreadLocal。remove()方法删除当前线程值,代码如下:try{threadLocal。set(System。nanoTime());。。。furtherprocessing}finally{threadLocal。remove();}复制代码finalize()方法
  finalize是潜在的内存泄漏问题的另一个来源。每当重写类的finalize()方法时,该类的对象不会立即被垃圾收集。相反,GC将它们排队等待最终确定,在稍后的时间点才会发送GC。
  如果用finalize()方法编写的代码不是最佳的,并且finalize队列无法跟上Java垃圾收集器,那么迟早,我们的应用程序注定要遇到OutOfMemoryError。
  如何避免我们应该总是避免使用finalize方法总结
  本文主要分享了自己项目中遇到的一个内存泄漏的问题,然后引出了内存泄漏的几种常见场景,希望大家能够引起重视。

最值得购买的人高性价比TCL电视机推荐高性价比TCL电视机推荐!1、TCLV6E5565英寸55和65寸TCLV6E适合对电视机要求都较低的人,平时只用来追追网剧且不怎么看体育比赛的人群!运行内存……春季是长个子黄金期,4种长高食物,营养好,孩子爱吃长个快春季是长个子黄金期,4种长高食物,营养好,孩子爱吃长个快春生夏长,秋收冬藏,春天是万物复苏,生长发育的大好时节。抓住这个好时节,让孩子快速的长个子。因为当今社会,个头高低……腾讯QQ音乐安卓版11。5内测版发布支持智能音质增强与音量平感谢IT之家网友XYXY的老同学的线索投递!IT之家3月4日消息,腾讯QQ音乐安卓版现已迎来11。5内测版更新,支持智能音质增强DMEE与音量平衡ReplayGain。……小米音乐4。6。0。0发布支持还原歌曲信息增加车载歌词等感谢IT之家网友hehehehehe的线索投递!IT之家3月1日消息,近期,小米音乐更新至4。6。0。0版本,本次新增了一些小功能,支持还原歌曲信息、增加车载歌词、新增K……腾讯音乐旗下波点音乐上线评论外显功能IT之家3月1日消息,近期,腾讯音乐旗下波点音乐上线评论外显功能,用户将在单曲推荐播放界面中,看到精选评论逐条自动播放。本次更新是波点音乐继2021年12月上线一周年升级2。0……小米卷轴屏散热专利获授权可通过进风实现主动散热IT之家3月23日消息,信息显示,3月22日,北京小米移动软件有限公司获得一种用于卷轴屏的散热结构及电子设备专利授权。摘要显示,本申请提出一种用于卷轴屏的散热结构及电子设……工业设计丨手电筒不止是工具,用设计让它变为时尚单品以往我们对手电筒的认知都觉得设计出来应该是工具风格,硬朗或者酷炫感。但在时尚快销时代,只执着与一种设计风格不利于面对多元化的用户审美。传统的手电筒对于年轻的用户来说已经是……国庆首日,27。33万游客畅游北京市属公园,这些公园游客最多北京日报客户端记者代丽丽国庆假期首日,北京市属公园共接待游客27。33万人次,游览量前三位的是天坛公园、北京动物园、颐和园。近3000名党员干部职工坚守岗位,加强节日期间……小米MIUI软件系统架构调整,开发版12月13日起停止发布新感谢IT之家网友你好猪哥、社会你王叔、Snapchat的线索投递!IT之家12月9日消息,据小米社区开发版内测公告发布信息,MIUI开发版内测21。12。8版本今天陆续发……小米MIXFold2出现在IMEI数据库,预计2022年6月感谢IT之家网友肖战割割的线索投递!IT之家12月9日消息,根据外媒xiaomiui消息,小米第二款折叠屏机型MIXFold2出现在IMEI数据库,通过了认证。这款手机型……小凯文波特我们的首发能打好开局替补队员只需保持或扩大优势直播吧11月27日讯火箭队今日主场击败雷霆队,取得两连胜,赛后,火箭队后卫小凯文波特接受了媒体采访。诚实地讲,我们一场比一场打得更好了,尤其是我们的首发阵容。小凯文波特说……樱花盛放,绚丽如画!岱庙春日壁纸又叒叕上新啦泰安日报社最泰安讯最美人间四月天,正是春花烂漫时。四月的岱庙,繁花似锦,分布在仁安门与配天门之间的樱花绚丽绽放,掩映着红墙黛瓦,美不胜收。樱花,又名山樱花、山樱桃、福岛樱……
无需手术!人流后宫腔粘连,自拟活血方,分离粘连,防止复粘一次人流造成宫腔粘连,成了小夫妻备孕路上的绊脚石。这是我门诊遇到的一个真实案例,小郭与丈夫在一起已经四五年时间了,去年的时候两个人结了婚准备要孩子,备孕一年多都没有好消息……315特刊新能源汽车销量涨了,投诉也涨了,都涉及哪些车企?又到了每一年的315国际消费者权益日,随着新能源汽车得到了市场和消费者的认可,新能源汽车的投诉也变得多了起来。2022年,平台接收新能源汽车投诉举报1。6万件,同比增长6……美日经济22高层会晤,启动新的研发机构,尹锡悦迟迟未入局这段时间,在看不见的国际博弈场合中,美日韩三方的关系正在悄然发生变化。据路透社7月30日报道:美日首次经济22(外长与商务部长)会谈在华盛顿启动,美日双方宣布将针对新一代……老话说白露食3白,老头变小孩,9。7白露,3白指什么?《月令七十二候集解》中对白露这个节气的诠释是:水土湿气凝而为露,秋属金,金色白,白者露之色,而气始寒也。9月7就是白露了,立秋不是秋,天凉白露后,昼夜温差逐渐变大,所以也就有俗……邢菲近照,又被美到了,这身打扮我太喜欢了,清新气息扑面而来古装剧《覆流年》是权谋题材大女主剧,由邢菲、翟子路主演。邢菲之前的古装扮相,总给人一种木木、缺少灵气的感觉,而新剧造型则让人眼前一亮。大婚时的红衣造型,看上去清冷傲……杜美玲在高尔夫球场上以优雅的白色套装得分最近,杜美玲(MLinh)小姐去打高尔夫球的画面在社交媒体上引起了很多人的喜爱。她穿着优雅的白色套装,包括一件铂质衬衫,搭配白色叠衣裙腿。杜美玲在高尔夫球场上以优雅的白色……暗能量相机在对银河的调查中揭示了空前的数十亿天体的存在天文学家们发布了一份对银河系平面的巨大调查。新的数据集包含了惊人的33。2亿个天体,可以说是迄今为止最大的此类目录。这一史无前例的调查数据是由美国能源部建造的强大的5。7亿像素……幼儿园来坏人了怎么办?河庄幼儿园进行反恐防暴演练当歹徒闯入幼儿园怎么办?幼儿园的孩子年龄尚小,自我保护能力弱,为了有效防范园内发生的暴力劫持事件,加强教职工面对突发恐怖事件的防范意识,确保教职工和幼儿的人身安全。日前,杭州市……世乒赛首轮前瞻!国乒7人有望旗开得胜,日本冠军大战华裔直板休斯顿世乒赛抽签结束后,国乒有7人出线在四个单项的首轮角逐中,唯有男双项目不参与首轮,两对组合樊振东王楚钦和林高远梁靖崑首轮轮空,直接晋级第2轮。由于国乒出战首轮的队员对手均不……华为苹果一加全都有!2023年换机怎么选,这份推荐报告请查收不知道大家在2023年有没有购机计划,如果有的话,那么你是选对了时机。因为在2023年,各大手机厂商旗下的产品,都有比较大的升级,尤其是在第二代骁龙8芯片的加持下,旗舰手机的性……刚刚,iOS15。5重磅新功能内推5月17日,凌晨Apple正式向所有果粉们推送iOS、iPadOS15。5正式版更新,版本号:19F77,主要修复一些错误。Apple将iOS开发重心都放在iOS16上,……罗杰斯要知道,父母的成功绝不等于孩子的成功世界投资家罗杰斯表示,有些有钱人可能和我不一样,他们自己这么辛苦地战斗,是为了让孩子能过上轻松富裕的生活,并把它当成自己人生的重要成就。出乎意料的是,这种成就感恰恰伤害了自己的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网