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

Java中怎样利用软引用和弱引用来避免oom

  本文的目录大纲:一。了解强引用、软引用、弱引用、虚引用的概念二。进一步理解软引用和弱引用三。如何利用软引用和弱引用解决OOM问题
  如果有不正之处,希望谅解和批评指正,不胜感激。请尊重作者劳动成果,转载请标明原文链接:一,了解强引用、软引用、弱引用、虚引用的概念
  在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。
  从JavaSE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:
  1。强引用(StrongReference)
  强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:ObjectobjectnewObject();Stringstrhello;
  只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:publicclassMain{publicstaticvoidmain(String〔〕args){newMain()。fun1();}publicvoidfun1(){ObjectobjectnewObject();Object〔〕objArrnewObject〔1000〕;}}
  当运行至Object〔〕objArrnewObject〔1000〕;这句时,如果内存不足,JVM会抛出OOM错误也不会回收object指向的对象。不过要注意的是,当fun1运行完之后,object和objArr都已经不存在了,所以它们指向的对象都会被JVM回收。
  如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
  比如Vector类的clear方法中就是通过将引用赋值为null来实现清理工作的:RemovestheelementatthespecifiedpositioninthisVector。Shiftsanysubsequentelementstotheleft(subtractsonefromtheirindices)。ReturnstheelementthatwasremovedfromtheVector。throwsArrayIndexOutOfBoundsExceptioniftheindexisoutofrange({codeindex0indexsize()})paramindextheindexoftheelementtoberemovedreturnelementthatwasremovedsince1。2publicsynchronizedEremove(intindex){modCount;if(indexelementCount)thrownewArrayIndexOutOfBoundsException(index);ObjectoldValueelementData〔index〕;intnumMovedelementCountindex1;if(numMoved0)System。arraycopy(elementData,index1,elementData,index,numMoved);elementData〔elementCount〕null;Letgcdoitsworkreturn(E)oldValue;}
  2。软引用(SoftReference)
  软引用是用来描述一些有用但并不是必需的对象,在Java中用java。lang。ref。SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。
  软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:importjava。lang。ref。SoftReference;publicclassMain{publicstaticvoidmain(String〔〕args){SoftReferenceStringsrnewSoftReferenceString(newString(hello));System。out。println(sr。get());}}
  3。弱引用(WeakReference)
  弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java。lang。ref。WeakReference类来表示。下面是使用示例:importjava。lang。ref。WeakReference;publicclassMain{publicstaticvoidmain(String〔〕args){WeakReferenceStringsrnewWeakReferenceString(newString(hello));System。out。println(sr。get());System。gc();通知JVM的gc进行垃圾回收System。out。println(sr。get());}}
  输出结果为:hellonull
  第二个输出结果是null,这说明只要JVM进行垃圾回收,被弱引用关联的对象必定会被回收掉。不过要注意的是,这里所说的被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用也是如此)。
  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。
  4。虚引用(PhantomReference)
  虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java。lang。ref。PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
  要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。importjava。lang。ref。PhantomReference;importjava。lang。ref。ReferenceQueue;publicclassMain{publicstaticvoidmain(String〔〕args){ReferenceQueueStringqueuenewReferenceQueueString();PhantomReferenceStringprnewPhantomReferenceString(newString(hello),queue);System。out。println(pr。get());}}
  二。进一步理解软引用和弱引用
  对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。
  在SoftReference类中,有三个方法,两个构造方法和一个get方法(WekReference类似):
  两个构造方法:publicSoftReference(Treferent){super(referent);this。timestampclock;}publicSoftReference(Treferent,ReferenceQueuelt;?superTq){super(referent,q);this。timestampclock;}
  get方法用来获取与软引用关联的对象的引用,如果该对象被回收了,则返回null。
  在使用软引用和弱引用的时候,我们可以显示地通过System。gc()来通知JVM进行垃圾回收,但是要注意的是,虽然发出了通知,JVM不一定会立刻执行,也就是说这句是无法确保此时JVM一定会进行垃圾回收的。
  三。如何利用软引用和弱引用解决OOM问题
  前面讲了关于软引用和弱引用相关的基础知识,那么到底如何利用它们来优化程序性能,从而避免OOM的问题呢?
  下面举个例子,假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。
  设计思路是:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。在Android开发中对于大量图片下载会经常用到。
  下面这段代码是摘自博客:
  http:blog。csdn。netarui319articledetails8489451privateMapString,SoftReferenceBitmapimageCachenewHashMapString,SoftReferenceBitmap();
  。。。。publicvoidaddBitmapToCache(Stringpath){强引用的Bitmap对象BitmapbitmapBitmapFactory。decodeFile(path);软引用的Bitmap对象SoftReferenceBitmapsoftBitmapnewSoftReferenceBitmap(bitmap);添加该对象到Map中使其缓存imageCache。put(path,softBitmap);}publicBitmapgetBitmapByPath(Stringpath){从缓存中取软引用的Bitmap对象SoftReferenceBitmapsoftBitmapimageCache。get(path);判断是否存在软引用if(softBitmapnull){returnnull;}取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空BitmapbitmapsoftBitmap。get();returnbitmap;}
  当然这里我们把缓存替换策略交给了JVM去执行,这是一种比较简单的处理方法。

苏宁去年巨亏苏宁预报,去年亏损430多亿,让人瞠目结舌。苏宁从零售企业开始,做的是家电专业店,然后连锁发展,门店达到数千家。成为这个业态的佼佼者。后来跨业态了,百货、购物中心、便利店……2021年8月电动车销量排名Model3重回榜首,进口车位居2021年8月最新电动车上市数据出炉,特斯拉Model3单月上市量突破400辆,重夺最畅销电动车称号。据报道,搭载CCS2充电规范的特斯拉Model3于8月25日正式开始……关于选苹果还是选华为,亲测以后给大家的一些小建议关于换手机想换苹果还是华为的朋友们给你们的一点建议,本人亲测。之前一直用的苹果手机,系统各方面也没有更新,加上经常自己清理垃圾,手机整体运行还是可以的,所以想换个手机的时……与巴菲特午餐,今年是最后一次了在因疫情中断了两年后,巴菲特慈善午餐拍卖活动将于今年6月重返拍卖平台。这将是竞标者最后一次有机会与巴菲特共进午餐。帮助无家可归者的慈善机构、Glide基金会表示,今年的活……交通运输部制修订新能源车辆蓄电池沥青路面材料和建筑垃圾循环利交通运输部网站1月21日消息,交通运输部印发《绿色交通十四五发展规划》提出,健全绿色交通标准规范体系。修订绿色交通标准体系,加强新技术、新设备、新材料、新工艺等方面标准的有效供……字节跳动推企业办公软件Lark海外率先上线试水北京商报讯(记者魏蔚)4月3日,字节跳动确认,针对海外市场发布的企业办公套件产品Lark已正式上线,初步覆盖IM即时通讯、共享日历、文档在线协作等基础企业协作功能,还支持在线音……注意!小米可能会限制多款国行机型更换第三方电池并减慢充电速度众所周知,苹果为了限制iphone用户更换第三方电池(也就是非官方电池),用户将iOS更新到一定版本之后,在系统中加入了检测电池是否是官方电池的功能,一旦发现用户更换了非官方电……人工智能技术可以怎样改变世界?机器人不再立即等同于半机械人,武装的金属生物以及有人驾驶或自主的类人机器人。即使是如今的Android一词,也经常被理解为Google开发的移动操作系统。人们已经超越了机器人的……小米最便宜的手机要来了性价到极致上周,小米在印度举办了红米Note7升级版红米Note7Pro的发布会,受到了粉丝和消费者的高度关注。随后小米官方表示,本月18号将在中国也发布红米Note7Pro。此外,昨日……刘金瑞互联网平台封禁现象的法律定性需要严谨审慎文雷晓琳夏宾由中国社会科学院大学互联网法治研究中心举办的开放、中立与创新驱动平台生态治理的理念和路径学术研讨会近日在线上举行。中国法学会法治研究所研究员刘金瑞在会上……戴助听器听自己说话声音格外大怎么回事?如果带上后感觉自己讲话声音特别大的话建议到验配中心做耳塞的调整,也可以做调试,如果感觉稍微有一些是正常的你好,戴上助听器以后自己的声音变大一点是正常的,如果到了难受的地步……PC鲜辣报RTX3090Super参数曝光新MBP提供两种尺本周我们将关注PC领域如下几条重点新闻,两条来自显卡市场,两条来自笔记本市场。RTX3090Super将于年内发布,NVIDIA旗舰显卡产品线将会进一步完善;IntelXess……
摄像头FCC认证测试哪些项目?摄像头FCC认证测试哪些项目?摄像头(CAMERA或WEBCAM)又称为电脑相机、电脑眼、电子眼等,是一种视频输入设备,被广泛的运用于视频会议,远程医疗及实时监控等方面。下面随……散热风扇CE认证办理散热风扇CE认证办理!散热风扇又称为电脑风扇,一般用于电脑CPU、显卡等部件散热,提供给散热器和机箱使用。散热风扇出口欧盟市场需要办理CE认证。散热风扇属于比较常用的小家电设备……全球最大经济圈形成,这次没有美国参与,美媒的评论尽显无奈果不其然,美媒又开始羡慕嫉妒恨。前两天,历经8年长跑,覆盖面积包括东盟10国以及中国、日本、韩国、澳大利亚和新西兰等5国的RCEP,即区域全面经济伙伴关系协定,终于正式签订。……vivo官宣S10代言人为Lisa蔡徐坤刘昊然2021年7月8日,vivo官方微博发布消息表示,将于7月15日发布vivoS10系列新机,代言人分别为Lisa、蔡徐坤、刘昊然。值得一提的是,在宣发海报上,vivo还展示了v……小米11被砍的设计意外曝光,网友错怪小米设计师了记得去年12月28日小米11发布的时候,很多网友吐槽其外观、设计一言难尽,甚至有网友去雷军微博评论:更换小米设计师!可是你们相信吗?现在小米11的外观是开发阶段最好看的一款。……海信新风空调,成2021年行业新风风向标以技术立企的海信空调,自2008年就已经推出首款新风空调,并经过多次的迭代升级,给用户对来划时代的产品。2021年,海信空调以新风产品为主的多元化产品矩阵主要定位,体现在……浅谈关于美团京东的所思所悟前一段时间各大头条上闹得满城风雨的美团员工缴纳社保问题让我不由得陷入深深思考,北京的一位副处长王林拜师外卖小哥,体验了一天送外卖的感受,最终仅收货41元,低于他出发前的100元……执行SpaceX首个商业载人航天任务的龙飞船成功降落法新社5月2日消息,美国国家航空航天局(NASA)称,执行SpaceX首个商业载人航天任务的龙飞船成功在佛罗里达州附近海岸降落。SpaceX也在推特上宣布了这一消息。《纽约时报……关于选择手机这件事情关于选择手机这件事情,我觉得这应该是个人、工作、环境等各种原因综合下来后所做的决定。就比如我,虽然之前也对苹果产品做过研究,也知道相较于安卓产品苹果都有那些好处,但是没办……8寸掌上游戏本WINMax,HDMI2。0标准接口,60W快为了能做到4K视频60Hz输出,WINMax摒弃了处理器内置的HDMI1。4控制器,转而采用独立的HDMI2。0b控制器,带宽高达18Gbps,支持最多32个声道,48bit最……爱沙尼亚正制定新的立法将加强加密货币行业规则BTC突破62000美元BTC突破62000美元,现报62025。71美元,日内涨幅达到3。33,行情波动较大,请做好风险控制。当前99。02的比特币供应量处于盈利状态……至纯科技国内高纯工艺系统龙头,概念虽好但是疑虑重重选股理由:营收稳定增长半导体概念股价逼近历史新高证券代码:603690评级:CCC本文分为六部分:一、主营业务;二、公司治理;三、财务分析;四、核心竞争力及投资逻辑……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网