应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

容易发生内存泄露的八个场景,你都知道吗?

  内存泄漏与内存溢出
  JVM在运行时会存在大量的对象,一部分对象是长久使用的,一部分对象只会短暂使用
  JVM会通过可达性分析算法和一些条件判断对象是否再使用,当对象不再使用时,通过GC将这些对象进行回收,避免资源被用尽
  内存泄漏:当不再需要使用的对象,因为不正确使用时,可能导致GC无法回收这些对象
  当不正确的使用导致对象生命周期变成也是宽泛意义上的内存泄漏
  内存溢出:当大量内存泄漏时,可能没有资源为新对象分配举例内存泄漏
  接下来将从对象生命周期变长、不关闭资源、改变对象哈希值、缓存等多个场景举例内存泄漏对象生命周期变长引发内存泄漏静态集合类publicclassStaticClass{privatestaticfinalListObjectlistnewArrayList();尽管这个局部变量Object生命周期非常短但是它被生命周期非常长的静态列表引用所以不会被GC回收发生内存溢出publicvoidaddObject(){ObjectonewObject();list。add(o);}}
  类卸载的条件非常苛刻,这个静态列表生命周期基本与JVM一样长
  静态集合引用局部对象,使得局部对象生命周期变长,发生内存泄漏饿汉式单例模式publicclassSingleton{privatestaticfinalSingletonINSTANCEnewSingleton();privateSingleton(){if(INSTANCE!null){thrownewRuntimeException(notcreateinstance);}}publicstaticSingletongetInstance(){returnINSTANCE;}}
  饿汉式的单例模式也是被静态变量引用,即时不需要使用这个单例对象,GC也不会回收非静态内部类
  非静态内部类会有一个指针指向外部类publicclassInnerClassTest{classInnerClass{}publicInnerClassgetInnerInstance(){returnthis。newInnerClass();}publicstaticvoidmain(String〔〕args){InnerClassinnerInstancenull;{InnerClassTestinnerClassTestnewInnerClassTest();innerInstanceinnerClassTest。getInnerInstance();System。out。println(外部实例对象内存布局);System。out。println(ClassLayout。parseInstance(innerClassTest)。toPrintable());System。out。println(内部实例对象内存布局);System。out。println(ClassLayout。parseInstance(innerInstance)。toPrintable());}省略很多代码。。。。。}}
  当调用外部类实例方法通过外部实例对象返回一个内部实例对象时(调用代码中的getInnerInstance方法)
  外部实例对象不需要使用了,但内部实例对象被长期使用,会导致这个外部实例对象生命周期变长
  因为内部实例对象隐藏了一个指针指向(引用)创建它的外部实例对象
  实例变量作用域不合理
  如果只需要一个变量作为局部变量,在方法结束就不使用它了,但是把他设置为实例变量,此时如果该类的实例对象生命周期很长也会导致该变量无法回收发生内存泄漏(因为实例对象引用了它)
  变量作用域设置的不合理会导致内存泄漏隐式内存泄漏
  动态数组ArrayList中remove操作会改变size的同时将删除位置置空,从而不再引用元素,避免内存泄漏
  不置空要删除的元素对数组的添加删除查询等操作毫无影响(看起来是正常的),只是会带来隐式内存泄漏不关闭资源引发内存泄漏
  各种连接:数据库连接、网络连接、IO连接在使用后忘记关闭,GC无法回收它们,会发生内存泄漏
  所以使用连接时要使用trywithresource自动关闭连接改变对象哈希值引发内存泄漏
  一般认为对象逻辑相等,只要对象关键域相等即可
  一个对象加入到散列表是通过计算该对象的哈希值,通过哈希算法得到放入到散列表哪个索引中
  如果将对象存入散列表后,修改了该对象的关键域,就会改变对象哈希值,导致后续要在散列表中删除该对象,会找错索引从而找不到该对象导致删除失败(极小概率找得到)publicclassHashCodeTest{假设该对象实例变量a,d是关键域a,d分别相等的对象逻辑相等privateinta;privatedoubled;Overridepublicbooleanequals(Objecto){if(thiso)returntrue;if(onullgetClass()!o。getClass())returnfalse;HashCodeTestthat(HashCodeTest)o;returnathat。aDouble。compare(that。d,d)0;}OverridepublicinthashCode(){returnObjects。hash(a,d);}publicHashCodeTest(inta,doubled){this。aa;this。dd;}publicHashCodeTest(){}OverridepublicStringtoString(){returnHashCodeTest{aa,dd};}publicstaticvoidmain(String〔〕args){HashMapHashCodeTest,IntegermapnewHashMap();HashCodeTesth1newHashCodeTest(1,1。5);map。put(h1,100);map。put(newHashCodeTest(2,2。5),200);修改关键域导致改变哈希值h1。a100;System。out。println(map。remove(h1));nullSetMap。EntryHashCodeTest,IntegerentrySetmap。entrySet();for(Map。EntryHashCodeTest,Integerentry:entrySet){System。out。println(entry);}HashCodeTest{a100,d1。5}100HashCodeTest{a2,d2。5}200}}
  所以说对象当作Key存入散列表时,该对象最好是逻辑不可变对象,不能在外界改变它的关键域,从而无法改变哈希值
  将关键域设置为final,只能在实例代码块中初始化或构造器中
  如果关键域是引用类型,可以用final修饰后,对外不提供改变该引用关键域的方法,从而让外界无法修改引用关键域中的值(如同String类型,所以String常常用来当作散列表的Key)缓存引发内存泄漏
  当缓存充当散列表的Key时,如果不再使用该缓存,就要手动在散列表中删除,否则会发生内存泄漏
  如果使用的是WeakHashMap,它内部的Entry是弱引用,当它的Key不再使用时,下次垃圾回收就会回收掉,不会发生内存泄漏publicclassCacheTest{privatestaticMapString,StringweakHashMapnewWeakHashMap();privatestaticMapString,StringmapnewHashMap();publicstaticvoidmain(String〔〕args){模拟要缓存的对象Strings1newString(O1);Strings2newString(O2);weakHashMap。put(s1,S1);map。put(s2,S2);模拟不再使用缓存s1null;s2null;垃圾回收WeakHashMap中存的弱引用System。gc();try{TimeUnit。SECONDS。sleep(5);}catch(InterruptedExceptione){e。printStackTrace();}遍历各个散列表System。out。println(HashMap);traverseMaps(map);System。out。println();System。out。println(WeakHashMap);traverseMaps(weakHashMap);}privatestaticvoidtraverseMaps(MapString,Stringmap){for(Map。EntryString,Stringentry:map。entrySet()){System。out。println(entry);}}}
  结果
  注意:监听器和回调也应该像这样成为弱引用总结
  这篇文章介绍内存泄漏与内存溢出的区别,并从生命周期变长、不关闭资源、改变哈希值、缓存等多方面举例内存泄漏的场景
  内存泄漏是指当对象不再使用,但是GC无法回收该对象
  内存溢出是指当大量对象内存泄漏,没有资源再给新对象分配
  静态集合、饿汉单例、不合理的设置变量作用域都会使对象生命周期变长,从而导致内存泄漏
  非静态内部对象有隐式指向外部对象的指针、使用集合不删除元素等都会隐式导致内存泄漏
  忘记关闭资源导致内存泄漏(trywithresource自动关闭解决)
  使用散列表时,充当Key对象的哈希值被改变导致内存泄漏(key使用逻辑不可变对象,关键域不能被修改)
  缓存引发内存泄漏(使用弱引用解决)

这顿饭,很特别吃得我眩晕,又清醒前天,我和我老公去东方明珠旋转餐厅吃了顿饭。或许是许久没去上海,加上前段的疫情经历,让我感慨颇多。旋转餐厅,在267m。与其说去那么高地方吃饭,不如说是为了俯……男子带陌生女子回工厂宿舍成焦点年轻的时候谁还没被骗过?碰上好心人帮忙,是福气。但是多数时候都要自己面对,谁的生活都不是容易的。身处异乡,身不由己,熬过去才能看到希望。网友爆料,一个年轻女孩……我科学家实现百公里级自由空间高精度时间频率传递可满足目前最高本报北京10月9日电(记者吴月辉、徐靖)记者从中国科学院获悉:近日,中国科学技术大学潘建伟团队与中科院上海技物所等单位合作,在国际上首次实现百公里级的自由空间高精度时间频率传递……初恋女神赵露思的上位史,和她那段不堪回首的恋情文娱来君赵露思,一个频繁登上热搜榜的名字。网友对她的看法两极分化,喜欢看网剧的人直呼她是甜宠剧女王初恋女神,不喜欢看网剧的人内心满是疑问:这人谁啊?其实很正常……WTT支线赛陈幸同首秀零封,钱天一狂轰11比1,携3位00后北京时间9月2日消息,2022年世界乒乓球职业大联盟WTT支线系列赛帕纳久里什泰站展开正赛首日争夺。女单首轮,陈幸同发挥出色,以4比0完胜瑞典选手博嘉德,钱天一以4比0战胜阿林……跑神梁晶马拉松遇难,被日本冠军称英雄,2岁女儿替父领奖文启汉圆桌派编辑世界我国著名的马拉松跑者梁晶,被无数爱好马拉松的人称为跑神,网友们也亲切地喊他为梁神,就连日本冠军井上真悟都对他佩服不已。然而,一场意外却让跑……车载显示真香,能否撬动面板行业复苏?近日,京东方、TCL华星、天马、维信诺等面板厂商的2022年上半年财报纷纷出炉。从各家企业公布的情况来看,整个显示行业依旧处于新一轮调整之中,今年上半年持续在低位徘徊,但其中的……去江西必吃的2茶2米2酒,全是当地人的心头好,你知道吗导语:去江西必吃的2茶2米2酒,全是当地人的心头好,你知道吗每当在工作生活或者出去旅游的时候总会遇到全国各地的游客,在无意中的攀谈过程中一般都会询问当地的饮食以及出名的小……白卷书生亿万富翁张铁生投资的上市公司是哪个当年靠一张白卷就考入大学的张铁生,相信大家都熟悉,正因为这份试卷,张铁生后来又入狱被判15年。等他41岁出狱后,创业成为了亿万富豪,那在他的身上发生了什么事?一、为何成为……知画原型揭秘!包衣出身,连生4胎,她才是永琪的白月光在电视剧《还珠格格天上人间》中,最大的女反派知画可谓是有心机、有才华、有容貌、有家世的四有反派。那历史上的知画真的像剧中那样令人反感吗?今天,黑狸狸就和大家聊一聊知画的原型。……酒店培训关于酒店服务知识体系,这篇就够了!(上)酒店酒店管理高登学苑是餐饮酒店行业人士共同参与的知识型内容互动平台,它来自餐饮酒店有识之士的分享,求知之士的共建,专注于传递、分享值得保存的餐饮酒店知识、常识、见识,让真……2天签2人!火箭两旧将加盟勇士队,先签训练营合同,再争留队名北京时间10月5号,今天和昨天两天时间里,勇士队一口气连续签下了2位火箭旧将。众所周知,当年的火箭队号称聚是一团火,散是满天星,不管是巨星级的火箭旧将哈登、保罗,还是优质的首发……
乔尔杰维奇选中CBA三大后卫,黑马力压赵继伟郭艾伦,赵睿无缘北京时间12月11日,CBA常规赛第二阶段开战以来,不少球队的表现都给人眼前一亮的感觉,相比第一阶段各支球队的实力悬殊严重,甚至有的球队外援都没有到齐,也有的球队伤员较多,所以……我和爸爸的高原当我提起笔写这篇文章的时候,就像手里握着一把刀,直刺心灵深处最痛的地方。37岁的我,不记得什么时候喊过一声爸爸。不是因为我没有爸爸,而是因为我面对爸爸时,怎么也喊不出爸爸这两个……世界杯奇闻趣事NO。10:英国报纸开玩笑英国的报纸也出过丑,第四届世界杯赛上美国队爆冷门以1:0击败英格兰队,记者发稿回去时,编辑认为记者开玩笑,自己还把比数改为1:……潘虹和刘雪华长相相似,可是气质却大不同,原因都在穿衣打扮当中这个世界上有长相十分相似的人,但是却很难出现气质相同的人,就比如潘虹跟刘雪华,她们两个就是属于长相相似,气质截然不同的类型,面部线条窄而长、骨骼突出、唇薄杏眼,以至于很多人都分……支付宝等5家机构首批通过个人金融信息保护能力认证近日,国内公布了首批通过个人金融信息保护能力认证的机构,支付宝(中国)网络技术有限公司等5家机构获北京国家金融科技认证中心认证通过。个人金融信息保护旨在切实保护金融消费者的权益……(科技)中国和新西兰科考人员到达克马德克海沟最深点新华社新西兰奥克兰11月27日电(记者郭磊卢怀谦)中国新西兰联合深渊深潜科考队27日在新西兰奥克兰表示,首次中国新西兰联合深渊深潜科考航次第一航段科考任务顺利完成,两国科考人员……早上起床第一件事不是穿衣喝水,按顺序做好6件事,效果不赖最近几年大家的养生意识逐渐高涨,开始注重生活方方面面有没有什么不足之处。比如补充水分这件事,很多人在早上穿衣起床后的第一件事就是喝一杯水润润喉,同时也有利于身体健康。老李……4方交易方案,涉及8球员5选秀权!湖人勇士赚大了,黄蜂送温暖在今天勇士对阵爵士的比赛中,勇士缺少了库里、格林、威金斯三大主力球员,不过在普尔、库明加、以及克莱的带领下,他们还是与爵士苦战至最后时刻,遗憾的是,普尔在最后1。4秒出现边线球……Apple注册商标xrOS作为其虚拟现实操作系统的新名称每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。彭博社的MarkGurman在他最近的一篇文章中报道称,苹果将使用……超越梅罗?世界杯5大新星蒙面侠第1贝林第2!恩佐第3加克波第在世界杯小组赛阶段,梅西、C罗和姆巴佩成为了许多媒体的头条新闻,但在卡塔尔世界杯上,还有许多球星达到了同样的高度,抢了他们的一些热度。以下是卡塔尔世界杯小组赛阶段,取得突破的5……潘多拉病毒苏醒雅库蒂亚湖永冻土48500年的史前巨型病毒复活据ETtoday(记者叶睿涵):北半球有四分之一的土地被永冻土覆盖,但随着全球暖化加剧,大片永冻土正在逐渐融化,导致已潜伏其中数十万年的大量微生物被释放,引发科学家担忧,认为它……县域经济榜单出炉42地GDP超千亿,义乌人均收入超8。6万元中新经纬11月29日电11月29日,稷夏全国综合竞争力百强县(市,区)等榜单发布。数据显示,GDP超千亿县(市)增至42个,分布11省份。榜单由稷夏智库受权根据中国社会科……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网