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

Android进阶之旅内存泄漏的危害有哪些?(案例分析)

  随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂;开发人员在程序实现的过程中处理的变量也大量增加,如何有效进行内存分配和释放,防止内存泄漏的问题变得越来越突出
  例如:服务器应用软件,需要长时间的运行,不断的处理由客户端发来的请求;如果没有有效的内存管理,每处理一次请求信息就有一定的内存泄漏;这样不仅影响到服务器的性能,还可能造成整个系统的崩溃;因此,内存管理成为软件设计开发人员在设计中考虑的主要方面内存泄漏的危害长时间运行,程序变卡,性能严重下降程序莫名其妙挂掉OutOfMemoryError错误乱七八糟的错误,还不易排查内存泄漏原因
  以产生的方式来分类,内存泄漏可以分为四类:1、常发性内存泄漏
  发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏2、偶发性内存泄漏
  发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生;常发性和偶发性是相对的;对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要3、一次性内存泄漏
  发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏4、隐式内存泄漏
  程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存;严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存;但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存所以,我们称这类内存泄漏为隐式内存泄漏
  从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在;真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存;从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到
  总之内存泄漏原因太多了;说不定就是某一行代码不对就会出现这种情况,关键的还是如何找出哪个地方出现了内存泄漏,代码好修改,错误不易查
  代码运行结果如下:大量使用静态变量
  静态变量的生命周期与程序一致;因此常驻内存prespellcheckfalseclassmdfencesmdendblocktycontaincmmodeLoadedlangcidn37mdtypefencesstyleboxsizing:borderbox;overflow:visible;fontfamily:var(monospace);fontsize:0。9em;display:block;breakinside:avoid;textalign:left;whitespace:normal;backgroundimage:inherit;backgroundposition:inherit;backgroundsize:inherit;backgroundrepeat:inherit;backgroundattachment:inherit;backgroundorigin:inherit;backgroundclip:inherit;backgroundcolor:rgb(248,248,248);position:relative!important;border:1pxsolidrgb(231,234,237);borderradius:3px;padding:8px4px6px;marginbottom:15px;margintop:15px;width:inherit;color:rgb(51,51,51);fontstyle:normal;fontvariantligatures:normal;fontvariantcaps:normal;fontweight:400;letterspacing:normal;orphans:2;textindent:0px;texttransform:none;widows:2;wordspacing:0px;webkittextstrokewidth:0px;textdecorationstyle:initial;textdecorationcolor:initial;publicclassStaticTest{publicstaticListIntegerlistnewArrayList();publicvoidpopulateList(){for(inti0;i10000000;i){list。add((int)Math。random());}System。out。println(running。。。。。。);}publicstaticvoidmain(String〔〕args){System。out。println(before。。。。。。);newStaticTest()。populateList();System。out。println(after。。。。。。);}}pre
  现在可以使用jvisualvm运行一边,看看内存效果带static关键字(使用静态变量)
  从上图可以看到,堆内存从一开始的135M左右飙升了到了200M。直接占据了65M的内存。不使用static关键字(不使用静态变量)
  由于全局变量与程序周期不一致,因此不使用时,就会进行回收。此时内存最高150M。
  总结:由于静态变量与程序生命周期一致,因此对象常驻内存,造成内存泄漏连接资源未关闭
  每当建立一个连接,jvm就会为这么资源分配内存。比如数据库连接、文件输入输出流、网络连接等等premdtypefencescidn64langclassmdfencesmdendblocktycontaincmmodeLoadedspellcheckfalsestyleboxsizing:borderbox;overflow:visible;fontfamily:var(monospace);fontsize:0。9em;display:block;breakinside:avoid;textalign:left;whitespace:normal;backgroundimage:inherit;backgroundposition:inherit;backgroundsize:inherit;backgroundrepeat:inherit;backgroundattachment:inherit;backgroundorigin:inherit;backgroundclip:inherit;backgroundcolor:rgb(248,248,248);position:relative!important;border:1pxsolidrgb(231,234,237);borderradius:3px;padding:8px4px6px;marginbottom:15px;margintop:15px;width:inherit;color:rgb(51,51,51);fontstyle:normal;fontvariantligatures:normal;fontvariantcaps:normal;fontweight:400;letterspacing:normal;orphans:2;textindent:0px;texttransform:none;widows:2;wordspacing:0px;webkittextstrokewidth:0px;textdecorationstyle:initial;textdecorationcolor:initial;publicclassFileTest{publicstaticvoidmain(String〔〕args)throwsIOException{FilefnewFile(G:nginx配套资料笔记资料。zip);System。out。println(f。exists());System。out。println(f。isDirectory());}}pre
  依然使用jvisualvm运行一边,看看内存效果。
  可以看出,在连接文件资源时,jvm会为本资源分配内存ThreadLocal的错误使用
  ThreadLocal主要用于创建本地线程变量,不合理的使用也有可能会造成内存泄漏
  上面这张图详细的揭示了ThreadLocal和Thread以及ThreadLocalMap三者的关系1、Thread中有一个map,就是ThreadLocalMap2、ThreadLocalMap的key是ThreadLocal,值是我们自己设定的3、ThreadLocal是一个弱引用,当为null时,会被当成垃圾回收
  重点来了,ThreadLocal是null了,也就是要被垃圾回收器回收了,但是此时我们的ThreadLocalMap生命周期和Thread的一样,它不会回收,这时候就出现了一个现象;那就是ThreadLocalMap的key没了,但是value还在,这就造成了内存泄漏
  解决办法:使用完ThreadLocal后,执行remove操作,避免出现内存溢出情况如何避免内存泄露?确保没有在访问空指针每个内存分配函数都应该有一个free函数与之对应,alloca函数除外每次分配内存之后都应该及时进行初始化,可以结合memset函数进行初始化,calloc函数除外每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对在对指针赋值前,一定要确保没有内存位置会变为孤立的每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应先遍历子内存位置并从那里开始释放,然后再遍历回父节点始终正确处理返回动态分配的内存引用的函数返回值尾述
  代码层面的检查可以帮助发现部分内存泄漏的问题,但是生产环境中的内存泄漏往往不容易提前发现,因为很多问题是在大并发场景下才会出现;因此还需要通过压力测试工具进行压力测试,提前发现潜在的内存泄漏问题
  有需要文中代码的同学,可以顺手给我点赞评论支持一下
  获取方式:私信发送源码,即可直达获取;现在私信还可获取一份Android开发系统性学习文档
  PS:有问题欢迎指正,可以在评论区留下你的建议和感受;
  欢迎大家点赞评论,觉得内容可以的话,可以转发分享一下

韩国第一,中国第二近年来,生育率持续走低一直是困扰世界上许多国家的大问题,尤其是越发达的国家和地区,人们生孩子的意愿就越少,这其中的原因十分复杂且多样,有社会进步、受教育水平提高导致的不愿生观念……斯坦福教授3岁起,用这15句话夸孩子,决定他们一生思维高度〔转发收藏〕〔比心〕你相信夸奖孩子的方式,可以改变他的思维方式吗?美国斯坦福教授实验证实:长期被夸你真聪明的孩子,在面对挑战任务时大部分会选择拒绝,而被夸奖你真努力的孩子……拒绝宋丹丹得罪王家卫,穷到卡里只剩100万,徐峥不敢与他合作他删掉600万粉丝的社交账号拒绝高片酬的爱情公寓5整整一年消失在观众的视野等再次出现已是这副模样亲手杀死了关谷神奇做回了属于自己的王传君从一……实在太惨烈!孙颖莎被闺蜜打得呆坐含泪,陈梦输到双眼紧闭11月10日,全锦赛女单14决赛结束了争夺,王曼昱、王艺迪、陈幸同、孙铭阳击败各自对手,继续前进,而陈梦吃了败仗,苦战五局,23不敌陈幸同,甚至被打到闭眼睛。真是太惨了!……探访卡塔尔世界杯房车营地200美元一晚值不值?卡塔尔世界杯所面临的最棘手的问题之一,就是如何解决上百万蜂拥而至的各国球迷住宿。除了尽可能地新建酒店和公寓,卡塔尔政府还想了不少办法,房车营地就是应对方案之一。俗话说,物……两大新品齐发!石头科技助力扫地机器人行业加速复苏【CNMO新闻】石头科技成立于2014年,是一家专注于智能清洁机器人及其他智能产品的品牌。在清洁机器人方面,石头科技目前已推出G、P和T等多个系列,涵盖不同的消费人群和差异化的……神探狄仁杰出现了三名内卫大阁领三名阁领,其中有四人死于非命在《神探狄仁杰》中,梅花内卫是女皇武则天设立的一个特务机构,负责刺探各种情报,处置不合武则天心意的大臣,成员众多,让人闻风丧胆。即使是朝廷重臣狄仁杰、张柬之,乃至太子、梁王这些……世界上最爱我的人去了纪念母亲去世十周年后记母亲去世后的几年时间,每当我们带公婆去餐馆吃饭、过年过节置办东西时,我不禁就会想到我的母亲:多少次在打麻将的人群中,在遛弯的人流中,在想似的背影里,在无数个梦里,幻想……锡安二代正式发售!球鞋待遇力压威少和东契奇,胖虎凭什么?目前JordanBrand旗下有三位球员拥有个人签名鞋,大家不可避免地会将这三双球鞋进行横向比较。发售定位1099元的JordanWhyNot0。5,中底配置为全掌Phy……杠上了!任泽平9天内6次炮轰苹果割高端韭菜价格歧视知名经济学家任泽平接连发文吐槽iPhone14,炮轰苹果公司通过价格歧视收智商税。这应该是9天内第6次炮轰苹果了,任泽平的再次发言引来了许多果粉的不满。今日午间,任泽平发……他们竟然曾经是队友,有些出乎意料在足球世界里,有些球员总是被联系在一起,密不可分。比如当年米兰的古利特、范巴斯滕和里杰卡尔德三剑客,曼联的约克和科尔黑风双煞。他们在场上就是战斗小组,代表着某支球队的某一段历史……在家请客聚餐绝对不能少了这3道硬菜,荤素均匀色香味俱全,真香随着人们生活水平的提高,越来越多的人不再满足于在外吃饭,特别是家里来了亲朋好友,难得见面,更是应该在家里吃才有一家人的感觉,就算是除外吃几顿,不可能一天三顿都在外面解决吧?那这……
三国志战略版换了个新图标,是什么新玩法?花席对游戏有很多期待有粉丝给花席发了张图,说自己的游戏图标变了,出现3个现代人,问这代表什么?看了图标后,花席感觉应该是某个活动,而近期的活动是联盟争霸赛,所以大概率是配合比赛做宣传的。……十里画廊醉美蒲河拂手皆景,入眼即画。四月的蒲河川春意盎然,远离城市,没有喧嚣和嘈杂,春的浪漫与诗意在这里体现的淋漓尽致。金黄色的油菜花铺满村野,绘就了春日最绚烂的美景。抬头满目花团……MIUI12要来了?小米宣布MIUI11开发版内测下周起停更感谢IT之家网友Marty0的线索投递!IT之家3月23日消息今天小米MIUI官方开发版内测公告发布了MIUI20。3。23内测开发版更新说明,表示,本周是MIUI11最……小米高管MIUI12将带来全局深色模式IT之家11月21日消息此前有消息称OPPO从小米MIUI、魅族Flyme挖走了不少工程师;昨日有网友在MIUI官方微博下就此传闻向官方询问:MIUI的工程师是不是被OPPO挖……歌手云朵近照,精致的妆容,皮肤的白皙,一点也不像36岁的人36岁的云朵近照,精致的妆容,皮肤的白皙,一点也不像36岁的人!云朵本是羌族一位普普通通的小女孩,她本名叫谢春芳,云朵这个名字是后来拜师刀郎,刀郎为其改的艺名。云朵……官宣!小米MIUI12万象息屏内容全面免费IT之家4月22日消息小米手机官方今日官宣MIUI12支持万象息屏功能,同时官方还宣布MIUI12万象息屏内容依然全部免费,相关内容将于4月25日全量公测。IT之家了解到……小米MIUI12支持万象息屏可随天气时间呈现不同视觉IT之家4月22日消息小米MIUI12将支持万象息屏功能,刚刚小米在官微透露了该功能的一些特性。据MIUI官方介绍,息屏基于MAML百变框架的底层能力,现在艺术家们可以实……小米MIUI12预热明天新功能万象息屏IT之家4月21日消息今天上午小米手机官微宣布,将于4月27日下午2点举行小米10青春版5G新品amp;MIUI12发布会。小米10青春版搭载后置4摄,支持50倍变焦。这次小米……小米10青春版支持分体式OIS防抖(更新变焦样张公布)〔下午12:11:26〕更新:小米官方放出了小米10青春版的变焦样张:IT之家4月23日消息今天小米官方开始预热小米10青春版的相机配置,该机支持50倍潜望式超远变焦,同……小米10青春版官宣采用全场景四摄系统,支持50倍潜望式变焦IT之家4月23日消息继此前小米手机正式官宣新款小米10青春版手机后,今日官方也放出了小米10青春版的相机模组细节。IT之家了解到,小米10青春版所搭载的全场景四摄系统由……值得期待!雷军确认小米10青春版还有一部哆啦A梦限定款IT之家4月22日消息今日小米手机官方也正式公布了新款小米10青春版的5款配色方案,不过小米手机CEO雷军表示,小米10青春版还有一款十分特别的配色方案。雷军表示,小米1……小米10青春版背部真机照公布方形后置四摄曲面机身设计IT之家4月22日消息继昨日小米手机正式官宣新款小米10青春版,今日官方也正式放出了这款手机的背部真机照。从海报来看,小米10青春版采用方形后置四摄方案以及曲面机身设计,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网