临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

一文搞懂JAVA中的引用

5月9日 眉梢欢投稿
  介绍
  JAVA中有4种类型的引用:
  强引用
  软引用
  弱引用
  虚引用
  这些引用仅在垃圾收集器管理它们的方式上有所不同。如果您从未听说过它们,则意味着您只使用过强的。了解其中的区别会对您有所帮助,尤其是当您需要存储临时对象并且不能使用像eHcache或Guava这样的真正的缓存库时。
  由于这些类型与JVM垃圾收集器密切相关,因此我将简要回顾一些有关JAVA中垃圾收集的信息,然后介绍不同的类型。垃圾收集器
  Java和C之间的主要区别是内存管理。在Java中,开发人员不需要知道内存是如何工作的(但他应该知道!),因为JVM使用其垃圾收集器来处理这部分。
  当您创建一个对象时,它由JVM在其堆中分配。堆是内存中有限的空间。因此,JVM经常需要删除对象以释放空间。为了销毁一个对象,JVM需要知道这个对象是活跃的还是不活跃的。如果一个对象被垃圾收集根引用(传递地),则该对象仍在使用中。
  例如:如果对象C被对象B引用,B被对象A引用,A被垃圾回收根引用,那么C、B和A被认为是活动的(情况1)。但是,如果B不再被A引用,则C和B不再处于活动状态并且可以被销毁(情况2)。
  由于这篇文章不是关于垃圾收集器的,所以我不会深入解释,但仅供参考,有4种类型的垃圾收集器根:局部变量活跃的Java线程静态变量JNI引用是包含本机代码的Java对象,而不是由jvm管理的内存
  Oracle没有指定如何管理内存,因此每个JVM实现都有自己的一套算法。但想法总是一样的:
  JVM使用循环算法寻找非活动对象并标记它们
  标记的对象被终结(调用finalize()方法)然后被销毁
  JVM有时会移动剩余对象的一部分为了重建堆中大面积的空闲连续空间问题
  如果JVM管理内存,您为什么需要关心?因为这并不意味着你不能有内存泄漏!
  大多数时候,您都在不知不觉中使用垃圾收集根。例如,假设您需要在程序的生命周期内存储一些对象(因为它们的初始化成本很高)。您可能会使用静态集合(List、Map等)在代码中的任何位置存储和检索这些对象:publicstaticMapK,VmyStoredObjectsnewHashMap();
  但是,这样做可以防止JVM破坏集合中的对象。您可能会错误地遇到OutOfMemoryError。例如:publicclassOOM{publicstaticListIntegermyCachedObjectsnewArrayList();publicstaticvoidmain(String〔〕args){for(inti0;i100000000;i){myCachedObjects。add(i);}}}
  输出是:
  线程main中的异常java。lang。OutOfMemoryError:Java堆空间
  Java提供了不同类型的引用来避免OutOfMemoryError。
  有些类型允许JVM释放对象,即使程序仍然需要它们。处理这些情况是开发人员的责任。强引用
  强引用是标准引用。当您像这样在对象obj上创建时:
  MyClassobjnewMyClass();
  您正在为新创建的MyClass实例创建一个名为obj的强引用。当垃圾收集器查找非活动对象时,它只检查对象是否是强可达的,这意味着通过强引用可传递地链接到垃圾收集根。
  使用这种类型的引用会强制JVM将对象保留在堆中,直到对象不被使用,如垃圾收集器部分所述。软引用
  根据javaAPIsoftreference有:
  软引用对象,由垃圾收集器根据内存需求自行清除
  这意味着如果您在不同的JVM(Oracle的Hotspot、Oracle的JRockit、IBM的J9等)上运行您的程序,软引用的行为可能会发生变化。
  让我们看一下Oracle的JVMHotspot(标准和最常用的JVM),看看它是如何管理软引用的。根据Oracle文档:
  默认值为每兆字节1000毫秒,这意味着对于堆中每兆字节的可用空间,软引用将存活(在收集到对象的最后一个强引用之后)1秒
  这是一个具体的例子:假设堆是512MB,还有400MB空闲。
  我们创建一个对象A,软引用到对象缓存,并强引用A到对象B。由于A被强引用到B,它是强可达的并且不会被垃圾收集器删除(案例1)。
  想象一下,现在B被删除了,所以A只是对缓存对象的软引用。如果对象A在接下来的400秒内没有被强引用,它将在超时后被删除(情况2)。
  以下是如何操作软引用:publicclassExampleSoftRef{publicstaticclassA{}publicstaticclassB{privateAstrongRpublicvoidsetStrongRef(Aref){this。strongR}}publicstaticSoftRpublicstaticvoidmain(String〔〕args)throwsInterruptedException{initialisationofthecachewithasoftreferenceofinstanceAExampleSoftRef。AinstanceAnewExampleSoftRef。A();cachenewSoftReferenceExampleSoftRef。A(instanceA);instanceAinstanceAisnowonlysoftreachableandcanbedeletedbythegarbagecollectoraftersometimeThread。sleep(5000);。。。ExampleSoftRef。BinstanceBnewExampleSoftRef。B();sincecachehasaSoftReferenceofinstanceA,wecantbesurethatinstanceAstillexistsweneedtocheckandrecreateaninstanceAifneededinstanceAcache。get();if(instanceAnull){instanceAnewExampleSoftRef。A();cachenewSoftReferenceExampleSoftRef。A(instanceA);}instanceB。setStrongRef(instanceA);instanceAinstanceAaisnowonlysoftlyreferencedbycacheandstronglyreferencedbyBsoitcannotbeclearedbythegarbagecollector。。。}}
  但是即使软引用对象被垃圾收集器自动删除,软引用(也是对象)也没有被删除!所以,你仍然需要清除它们。例如,对于像64Mbytes(Xmx64m)这样的小堆大小,尽管使用了软引用,但以下代码会给出OutOfMemoryException。publicclassTestSoftReference1{publicstaticclassMyBigObject{eachinstancehas128bytesofdataint〔〕datanewint〔128〕;}publicstaticintCACHEINITIALCAPACITY1000000;publicstaticSetSoftReferenceMyBigObjectcachenewHashSet(CACHEINITIALCAPACITY);publicstaticvoidmain(String〔〕args){for(inti0;i1000000;i){MyBigObjectobjnewMyBigObject();cache。add(newSoftReference(obj));if(i2000000){System。out。println(sizeofcache:cache。size());}}System。out。println(End);}}
  输出代码是:
  缓存大小:1
  缓存大小:200001
  缓存大小:400001
  缓存大小:600001
  线程主java。lang。OutOfMemoryError中的异常:超出GC开销限制
  Oracle提供了一个ReferenceQueue,当引用的对象只能软访问时,它会填充软引用。使用此队列,您可以清除软引用并避免OutOfMemoryError。
  使用ReferenceQueue,与上面相同的代码具有相同的堆大小(64MB)但要存储更多数据(500万对100万):publicclassTestSoftReference2{publicstaticintremovedSoftRefs0;publicstaticclassMyBigObject{eachinstancehas128bytesofdataint〔〕datanewint〔128〕;}publicstaticintCACHEINITIALCAPACITY1000000;publicstaticSetSoftReferenceMyBigObjectcachenewHashSet(CACHEINITIALCAPACITY);publicstaticReferenceQueueMyBigObjectunusedRefToDeletenewReferenceQueue();publicstaticvoidmain(String〔〕args){for(inti0;i5000000;i){MyBigObjectobjnewMyBigObject();cache。add(newSoftReference(obj,unusedRefToDelete));clearUselessReferences();}System。out。println(End,removedsoftreferencesremovedSoftRefs);}publicstaticvoidclearUselessReferences(){R?extendsMyBigObjectrefunusedRefToDelete。poll();while(ref!null){if(cache。remove(ref)){removedSoftR}refunusedRefToDelete。poll();}}}
  输出是:
  结束,删除软引用4976899
  当您需要存储许多对象时,软引用很有用,如果它们被JVM删除,这些对象可能会(代价高昂)重新实例化。弱引用
  弱引用是一个比软引用更易变的概念。根据JAVAAPI:
  假设垃圾收集器在某个时间点确定一个对象是弱可达的。届时,它将自动清除对该对象的所有弱引用以及对该对象可通过强引用链和软引用链访问的任何其他弱可达对象的所有弱引用。同时,它会声明所有以前的弱可达对象是可终结的。同时或在稍后的某个时间,它会将那些在引用队列中注册的新清除的弱引用排入队列。
  这意味着当垃圾收集器检查所有对象时,如果它检测到一个对象只有对垃圾收集根的弱引用(即没有强引用或软引用链接到该对象),该对象将被标记为移除并尽快删除。使用WeakReference的方法与使用SoftReference完全相同。因此,请看软引用部分的示例。
  Oracle提供了一个非常有趣的基于弱引用的类:WeakHashMap。该映射具有弱引用键的特殊性。WeakHashMap可以用作标准Map。唯一的区别是它会在键从堆中销毁后自动清除:publicclassExampleWeakHashMap{publicstaticMapInteger,StringcachenewWeakHashMapInteger,String();publicstaticvoidmain(String〔〕args){Integeri5newInteger(5);cache。put(i5,five);i5theentry{5,five}willstayintheMapuntilthenextgarbagecollectorcallIntegeri22;theentry{2,two}willstayintheMapuntili2isnomorestronglyreferencedcache。put(i2,two);remebmbertheOutOfMemoryErroratthechapterproblem,thistimeitwonthappenbecausetheMapwillclearitsentries。for(inti6;i100000000;i){cache。put(i,String。valueOf(i));}}}
  例如,我使用WeakHashMap来解决以下问题:存储多个交易信息。我使用了这个结构:WeakHashMapString,MapK,V其中WeakHashMap的键是一个包含交易ID的字符串,简单Map是我需要在生命周期内保留的信息交易。有了这个结构,我肯定会在WeakHashMap中获取我的信息,因为包含事务ID的字符串在事务结束之前不会被销毁,而且我不必关心清理Map。
  Oracle建议使用WeakHashMap作为规范化映射。虚引用
  在垃圾收集过程中,没有对垃圾收集根的强软引用的对象将被删除。在被删除之前,方法finalize()被调用。当一个对象被终结但没有被删除(还)时,它就变成了幻影可达,这意味着在对象和垃圾收集根之间只有一个幻影引用。
  与软引用和弱引用不同,对对象使用显式幻像引用可以防止对象被删除。程序员需要显式或隐式地移除幻影引用,以便销毁最终化的对象。要显式清除幻影引用,程序员需要使用ReferenceQueue,当对象完成时,它会填充幻影引用。
  幻影引用无法检索被引用的对象:幻影引用的get()方法始终返回null,因此程序员无法再次使幻影可达对象强软弱可达。这是有道理的,因为幻影可达对象已经完成,所以如果重写的finalize()函数已清除资源,它可能不再工作。
  由于无法访问引用的对象,因此我看不出幻影引用有何用处。一个用例可能是,如果您需要在对象完成后执行操作,而您不能(或出于性能原因不想)在该对象的finalize()方法中执行特定操作。结论
  我希望您现在对这些参考资料有了更好的了解。大多数时候,您不需要显式使用它们(也不应该)。但是,许多框架正在使用它们。如果你想了解东西是如何工作的,那么了解这个概念是很好的。

一文搞懂JAVA中的引用介绍JAVA中有4种类型的引用:强引用软引用弱引用虚引用这些引用仅在垃圾收集器管理它们的方式上有所不同。如果您从未听说过它们,则意味着您只使……施工安全管理(大家元旦快乐啊,不知道元旦大家怎么度过的,出去旅游的固然高兴,没去旅游的也别不开心,我替大家走了走,哈哈哈)这个景色还是不错哈,不过手机没拍出它的美,建议大家自己去看看……零下二十几度的严寒,新疆是旅行淡季,却是感受大自然的最好季节新疆的冬天有很多故事,关于冰川和大雪,峡谷和枯树,沙漠和风,西域的苍凉感来自于空间上的广阔、时间上的久远。冬季的新疆是旅行淡季,却也是感受自然的最好季节,那些荒野、古迹都……感悟什么是自由?有时我在想,到底什么是自由?也许从我们呱呱坠地那一刻起,我们就在渴望自由,为了能够自由,我们需要快快长大,因为只有自身强大了,我们才能得到自由。从此,在漫长的人生旅……最成功的失败者,他们已是克罗地亚的传奇一代记者寒冰报道半决赛开始国际足联启用了全新的比赛用球,这个用球名为AlHilm(梦想),取代了此前杯赛使用的ALRihla(旅程)。然而,全新的比赛用球延续了梅西和阿根廷的梦想,……篮网9连胜!都夸杜兰特和欧文厉害,谁注意到西蒙斯的表现?沃恩近来人逢喜事精神爽,上一回略施小技,用斯嘉丽的爱好秘籍和修仙宝典,收服杜欧两大神将,为其所用。灭勇士擒雄鹿后,又趁热打铁,兵发克城。沃恩深知夫战,勇气也。一鼓作气,再……吉林铁路公安处诗歌专辑(二)01hr你一路走来作者邹馨毅你一路走来。在艰险里奋进,于困顿中多情。那每一片铁轨纵横的原野上,都有你深情的守望。那每一列驰骋奔波的列车……一路囧途之川西北小环线三千公里穷游(川藏进青藏出)准备篇15年国庆前10天,就有出游打算了。去哪儿?世界这么大!稻城亚丁一下子从脑门蹦出,翻出老爸每年更新的地图,在白纸上开始设计南北两条路线,每天行程落脚点附近美食景点和沿途需准备的……3位博士联手创业,集结3500位科学家,撑起一家1415亿中提及我们的人工智能,很多人对他都是抱有以一种非常独特的情感的。毕竟人工智能作为我们人类未来发展的一大方向,他所具备的潜力是非常巨大的。很多人对此都有印象,尤其是再各大科幻电影里……几天之内,娱乐圈噩耗不断,有哪些明星永失吾爱2016年,父亲葛存壮因脑梗引发心脏衰竭不幸离世,而葛优在父亲离去的两个月期间,也陷入到极度焦虑和失眠的状态。葛存壮与儿子葛优自从父亲葛存壮辞世以后,已经88岁的母……双11对消费和经济的拉动作用到底怎么样?双11,这个电商平台自创的购物狂欢节,可以说是电商最重要的模式创新之一。从一开始,双11的销售数据就很惊人,而且此后每年都在增长。双11的玩法一直在变。最开始是11月11……故意制造遗憾有种心脏受虐的快感其实我不明白为什么这么痛苦仍旧还要爱但我想人可能的确是靠痛苦感知爱意越痛苦爱意越蓬勃。我从很早很早以前就变得不像以前的我了,不能说不幸,只是自己暂且拥有的一切都被改变了。……
舒服!中国女篮大胜波多黎各,谁留意到姚明往后一躺玩起了手机女篮世界杯,中国队9560大胜波多黎各提前锁定8强,全场比赛,女篮的姑娘们没遇到太多麻烦,从开头到结束,从几分到几十分,姑娘们一路快刀斩乱麻的赢了一路,早早就把悬念打没了,把胜……OPPOA1Pro正式官宣首发2160Hz高频调光,截胡真我11月14日消息,OPPO官微宣布:11月16日将发布OPPOA1Pro,行业首发2160Hz高频调光和2。32mm极窄下巴,截胡真我10Pro。除此之外,这款新机还拥有1亿像……地球的46亿年,到底经历了什么你知道我们的地球是怎么生成的吗?今天,就带小伙伴们聊一聊我们的地球。请小伙伴们在屏幕上点两下,我们接着聊。46亿年前,我们的地球还没有完全成型,到处流动着熔岩,表面温度高……Theshy的魔障shy刀、血条消失术、那个男人等等有太多的标签就知道我说的是谁,一个大家很喜欢,职业选手也赞美的LOL上单选手Theshy姜承録。很难想象在S8冠军成员IG分崩离析后,T……亚洲杯最新积分榜!中国女排锁定小组第一,6队提前晋级八强2022年女排亚洲杯进入第三个比赛日争夺,中国女排继前两个比赛日先后击败韩国、越南女排之后迎来第三个对手菲律宾女排,结果中国女排遭遇了东道主强有力抵抗,中国队依靠吴梦洁和庄宇珊……(经济)智能科技设备服务双11快递中转安全高效双11即将来临,位于天津航空物流区的顺丰速运天津全自动中转枢纽迎来快件中转到达高峰期。该中转枢纽投入六面扫描仪、高速安检机、雾化消杀机器人等智能科技设备,保障双11高峰期间快递……和五菱星辰自驾游象牙山把春天装进旅途春暖花开的季节里,来一场自驾游,无疑是对春天最好的尊重,休息日闲着无聊来一场短距离的乡村游,走进乡村爱情电视剧的拍摄地去踏青,体验农村生活,看山清水秀,吃最地道的……环游苏南八古镇(2)千灯古镇,一座景点众多魅力四射的古镇千灯古镇的魅力四射(摄影钰林等)9月5日中午,我们在甪直古镇吃过中餐,立即驱车奔赴第二个景点千灯古镇。千灯古镇对我们来说,都有点陌生,以前没有听说过这个古镇。……520,10部糖份超标,恋爱感拉满的恋爱甜宠剧,你最喜欢哪一520到了,在这样的节日真的适合和你的TA看一部唯美又浪漫的爱情片,比如下面这几部,看完保准让你立马就想谈恋爱。《余生,请多指教》这部剧由肖战、杨紫主演,讲述了音乐……榜单最新流畅机型TOP10有你吗ColorOS拿下最流畅系统近日,鲁大师发布了2022年第三季度Q3(79月)数据报告,评选了一份涵盖手机性能、流畅度、系统UI流畅度的排行榜。其中鲁大师发布的Q3季度手机流畅榜TOP5依次是:vi……努比亚Z40SPro官宣20号发布,将推国漫灵笼限定版近年来各大手机厂商都纷纷加入联名大军,如小米最新的12SUltra与徕卡合作的这很徕卡就真的很徕卡。将于本月20号发布的努比亚Z40SPro也官宣与国漫之光《灵笼》推出联名限定……2022。4。27世界足坛热门事件回顾1。欧冠战报:曼城43皇马,丁丁传射,本泽马双响笨马虽然拼尽全力,但难挡德布劳内立定乾坤福东有诗云:笨马双响来势汹,丁丁传射建奇功2。体坛资讯:张玉宁面对侵犯……
友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找