1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Java中弱引用的概念和作用是什么

      本篇內(nèi)容介紹了“Java中弱引用的概念和作用是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

      創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比延長網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式延長網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋延長地區(qū)。費用合理售后完善,十年實體公司更值得信賴。

      概覽

      本文會通過對弱引用的定義講起,然后通過案例的使用一步一步的深入源碼進(jìn)行分析其原理,從而讓讀者深刻的理解什么是弱引用,如何使用弱引用,什么場景下會使用弱引用,弱引用可以解決什么樣的問題,以及它的源碼實現(xiàn)是怎樣的,其中會涉及的內(nèi)存溢出,垃圾回收原理

      作用:

      jdk 官網(wǎng)解釋:

      • 弱引用主要應(yīng)用在不阻止它的key或者value 被回收的mapping。直接貼英文吧,翻譯水平有限(weak references are for  implementing canonicalizing mappings that do not prevent their keys (or values)  from being reclaimed)

      個人理解:

      • 弱引用的出現(xiàn)就是為了垃圾回收服務(wù)的。它引用一個對象,但是并不阻止該對象被回收。如果使用一個強引用的話,只要該引用存在,那么被引用的對象是不能被回收的。弱引用則沒有這個問題。在垃圾回收器運行的時候,如果一個對象的所有引用都是弱引用的話,該對象會被回收

      案例深度解析

      理想的情況下,我們希望當(dāng)我們不再使用一個對象的時候,能夠在gc  發(fā)生的時候就把它回收掉。但是有些時候,由于我們的粗忽,在壞的情況下會導(dǎo)致內(nèi)存溢出。這種案例尤其發(fā)生在一個生命使用周期很長的map  存放了很多實際使用生命周期短的對象。請看下面這個例子

      Java中弱引用的概念和作用是什么

      Java中弱引用的概念和作用是什么

      運行后輸出結(jié)果:

      gc 發(fā)生前:1 開始通知GC gc 發(fā)生后:1

      從輸出的結(jié)果可以看到,即使我們通過把key和value 設(shè)置為null 來告訴jvm,我們不再使用這個對象了,map 里面對象依然沒有被GC  回收,因為key和value 被一個強引用map 指向,根據(jù)可達(dá)性判斷,垃圾回收器是不能回收掉key和value 這個對象的。map 被定義為statis  的靜態(tài)變量,是一個使用生命周期很長的對象。在strongTest()方法中存在了一個key和value  的局部變量,它隨著方法的執(zhí)行完,這個變量的生命使用周期就結(jié)束了,但是粗糙的程序員忘記remove  了,這個時候垃圾回收器是不能回收它的。如果這種生命周期相對短的對象很多,最終就有可能消耗掉JVM中全部的內(nèi)存。

      但是這里我有一個好奇,假如這里的key和value 指向的對象在執(zhí)行完strongTest()方法  以后用不著了,但是我可能又不是很好的判斷去主動調(diào)用remove  來移除它。想要垃圾回收器自己判斷回收掉可不可以呢?答案其實是可以的,這個時候就是弱引用上場了,請看下面程序

      Java中弱引用的概念和作用是什么

      Java中弱引用的概念和作用是什么

      運行上面代碼輸出結(jié)果

      gc 發(fā)生前:1 開始通知GC gc 發(fā)生后:0

      從輸出結(jié)果0,我們可以判斷已經(jīng)成功被垃圾回收了。what?整個過程我們只是把HashMap 換成了WeakHashMap,并且key 由String  換成了WeakReference。其實就是由于字符串只有弱引用指向,所以可以被垃圾回收掉。是不是很簡單,如果到這里你就停止研究弱引用了,那就太暴殄天物了

      WeakHashMap 深度解析

      上面的程序片段中,其實只有key 設(shè)置了為弱引用new WeakReference<>(key),那正常也就只有這個key  對應(yīng)的內(nèi)存被回收而已,由于沒有調(diào)用remove ,里面的value 和entry 也是不會回收掉的,那為什么最后輸出的size 是0 呢?  很好的問題,我們深入去看WeakHashMap 的源碼,我們發(fā)現(xiàn)了一個神奇的方法expungeStaleEntries()。在看源碼之前先解析下引用隊列的概念:  在弱引用被回收的時候會把該對象放到引用隊列中,也就意味著從引用隊列中獲取的對象都是被回收的對象,先解釋到這里,足以滿足我們下面的源碼分析了,接下來會做詳細(xì)的解析

      Java中弱引用的概念和作用是什么

      Java中弱引用的概念和作用是什么

      從上面的代碼片段,大概的意思就是從引用隊列里面取出被回收的對象,然后和WeakHashMap 中的對象查找,找到之后就把對應(yīng)的value  也設(shè)置為null,并且把對應(yīng)的entry 設(shè)置為null,來告訴GC 去回收它。從源碼可以看到expungeStaleEntries()  這個方法在執(zhí)行WeakHashMap中的任何方法的時候都會被調(diào)用到的

      Java中弱引用的概念和作用是什么

      到這里也就完全明白為什么value 不設(shè)置為弱引用和沒有顯性的調(diào)用remove 方法也可以回收掉了

      引用隊列

      從上面的的源碼中,我們大概知道了引用隊列的使用,那為什么要使用引用隊列呢?假如沒有引用隊列,上面的例子我們就需要遍歷全部的元素一個一個的去找,如果數(shù)量少那還好,如果數(shù)量多的時候,肯定就會出現(xiàn)一些性能問題。有了引用隊列那就輕松可以解決上面的問題了。從WeakReference  源碼中我們可以看到有兩個構(gòu)造函數(shù),第二個是需要傳入引用隊列的

      Java中弱引用的概念和作用是什么

      引用隊列hello word

      Java中弱引用的概念和作用是什么

      使用中需要注意的細(xì)節(jié): 由于弱引用的對象在GC 發(fā)生的時候都可能會被回收掉,所以在使用之前我們都需要判斷下是否為null 來避免空指針異常

      Java中弱引用的概念和作用是什么

      總結(jié)

      1. 弱引用的出現(xiàn)是為了垃圾回收的

      2. 一個對象只有弱引用指向它的時候,它是可以被回收的

      3. 弱引用是在GC 發(fā)生的時候就進(jìn)行回收,不管當(dāng)時內(nèi)存是否充足

      4. 如果你在創(chuàng)建弱引用指定一個引用隊列的話,弱引用對象被回收的時候,會把該對象放入引用隊列中

      5. 為了安全使用,每次都要判斷下是否為空來判斷該對象是否已經(jīng)被回收,來避免空指針異常

      “Java中弱引用的概念和作用是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


      分享題目:Java中弱引用的概念和作用是什么
      分享路徑:http://ef60e0e.cn/article/pespdo.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        监利县| 平山县| 历史| 济宁市| 汪清县| 古交市| 甘德县| 新邵县| 咸丰县| 都昌县| 泾川县| 宜良县| 富锦市| 江川县| 普兰店市| 莲花县| 修文县| 正宁县| 常德市| 杭州市| 怀远县| 揭西县| 收藏| 桐城市| 环江| 荃湾区| 靖边县| 玛纳斯县| 平安县| 蒙阴县| 城市| 延吉市| 全州县| 资兴市| 于都县| 沧州市| 昌乐县| 海门市| 阆中市| 辛集市| 定日县|