日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用java理解程序逻辑 第十二章_Java弱引用的理解与使用

發布時間:2025/3/13 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用java理解程序逻辑 第十二章_Java弱引用的理解与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java弱引用的理解與使用

WeakReference

前言

?看到篇帖子, 國外一個技術面試官在面試senior java developer的時候, 問到一個weak reference相關的問題. 他沒有期望有人能夠完整解釋清楚weak reference是什么, 怎么用, 只是期望有人能夠提到這個concept和java的GC相關. 很可惜的是, 20多個擁有5年以上java開發經驗的面試者中, 只有兩人知道weak reference的存在, 而其中只有一人實際用到過他. 無疑, 在interviewer眼中, 對于weak reference的理解和應用在面試中給了這一個interviewee相當多的加分.? 所以, 將我對于這個技術的理解和使用總結在這篇推文里, 希望讀者和自己通過讀和寫這篇推文, 能夠在以后的工作和面試中獲得加分.

在Java里, 當一個對象o被創建時, 它被放在Heap里. 當GC運行的時候, 如果發現沒有任何引用指向o, o就會被回收以騰出內存空間.

或者換句話說:

一個對象被回收, 必須滿足兩個條件:

1.沒有任何引用指向它?

2.GC被運行.

在現實情況寫代碼的時候, 我們往往通過把所有指向某個對象的referece置空來保證這個對象在下次GC運行的時候被回收 (可以用java -verbose:gc來觀察gc的行為)

Object c = new Car();c=null;

But:

手動置空對象對于程序員來說, 是一件繁瑣且違背自動回收的理念的.??對于簡單的情況, 手動置空是不需要程序員來做的, 因為在java中, 對于簡單對象, 當調用它的方法執行完畢后, 指向它的引用會被從stack中popup, 所以他就能在下一次GC執行時被回收了.

但是, 也有特殊例外. 當使用cache的時候, 由于cache的對象正是程序運行需要的, 那么只要程序正在運行, cache中的引用就不會被GC給(或者說, cache中的reference擁有了和主程序一樣的life cycle). 那么隨著cache中的reference越來越多, GC無法回收的object也越來越多, 無法被自動回收. 當這些object需要被回收時, 回收這些object的任務只有交給程序編寫者了. 然而這卻違背了GC的本質(自動回收可以回收的objects).

所以, java中引入了weak reference. 相對于前面舉例中的strong reference:

Object c = new Car(); //只要c還指向car object, car object就不會被回收
  • 當一個對象僅僅被weak reference指向, 而沒有任何其他strong reference指向的時候, 如果GC運行, 那么這個對象就會被回收. weak reference的語法是:

WeakReference?weakCar?=?new?WeakReference(Car)(car);
  • 當要獲得weak reference引用的object時, 首先需要判斷它是否已經被回收:

weakCar.get(); //如果此方法為空, 那么說明weakCar指向的對象已經被回收了.

下面來看一個例子:

//Car類package weakreference;/** * @author wison */public class Car { private double price; private String colour; public Car(double price, String colour){ this.price = price; this.colour = colour; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getColour() { return colour; } public void setColour(String colour) { this.colour = colour; } public String toString(){ return colour +"car costs $"+price; } }package weakreference;import java.lang.ref.WeakReference;/** * @author wison */public class TestWeakReference { public static void main(String[] args) {????//看這塊代碼 Car car = new Car(22000,"silver"); WeakReference weakCar = new WeakReference(car); int i=0; while(true){ if(weakCar.get()!=null){ i++; System.out.println("Object is alive for "+i+" loops - "+weakCar); }else{ System.out.println("Object has been collected."); break; } } }}

在上例中, 程序運行一段時間后, 程序打印出"Object has been collected." 說明, weak reference指向的對象的被回收了.

值得注意的一點?:

即使有?car?引用指向對象, 且?car?是一個strong reference, weak reference weakCar指向的對象仍然被回收了. 這是因為java的編譯器在發現進入while循環之后,?car?已經沒有被使用了, 所以進行了優化(將其置空?). 當把TestWeakReference.java修改為:

package weakreference;import java.lang.ref.WeakReference;/** * @author wison */public class TestWeakReference { public static void main(String[] args) { Car car = new Car(22000,"silver"); WeakReference weakCar = new WeakReference(car); int i=0; while(true){ System.out.println("here is the strong reference 'car' "+car); if(weakCar.get()!=null){ i++; System.out.println("Object is alive for "+i+" loops - "+weakCar); }else{ System.out.println("Object has been collected."); break; } } }}

weak reference指向的object就不會被回收了. 因為還有一個strong reference?car?指向它.

注意: WeakReference的一個特點是它何時被回收是不可確定的, 因為這是由GC運行的不確定性所確定的. 所以, 一般用weak reference引用的對象是有價值被cache, 而且很容易被重新被構建, 且很消耗內存的對象.

推文

后記

-ReferenceQueue

weak reference指向的對象被回收后, weak reference本身其實也就沒有用了. java提供了一個ReferenceQueue來保存這些所指向的對象已經被回收的reference. 用法是在定義WeakReference的時候將一個ReferenceQueue的對象作為參數傳入構造函數.

其他類型的references

-SoftReference

soft reference和weak reference一樣,?

但被GC回收的時候需要多一個條件:?當系統內存不足時(GC是如何判定系統內存不足? 是否有參數可以配置這個threshold?), soft reference指向的object才會被回收. 正因為有這個特性, soft reference比weak reference更加適合做cache objects的reference. 因為它可以盡可能的retain cached objects, 減少重建他們所需的時間和消耗.

? ? ? 自知之明是最難得的知識,

最靈繁的人也看不見自己的背脊。

——《C++團隊》

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的使用java理解程序逻辑 第十二章_Java弱引用的理解与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩黄网站 | 久草免费在线视频 | 欧美激情视频一区二区 | 日本黄色播放器 | 色婷婷狠狠操 | 国产男男gay体育生白袜 | 国产又大又粗又爽的毛片 | 97久久国产精品 | 日韩爱爱片| av最新版天堂资源在线 | 亚洲一区二区国产 | 特色特色大片在线 | 日本午夜影院 | 日韩国产毛片 | a天堂视频在线观看 | 麻豆免费av | 99精品一区二区三区无码吞精 | 国内精品少妇 | 国产高清免费视频 | 成人午夜免费福利视频 | 欧美特一级 | 国产av不卡一区二区 | yy色综合 | 无码人妻精品一区二区三区夜夜嗨 | 日韩一区二区三区四区在线 | 日本资源在线 | 国产精品一区二区三区在线免费观看 | 免费成人在线观看视频 | 亚洲国产视频网站 | 亚洲成a人v欧美综合天堂麻豆 | 又色又爽又黄无遮挡的免费视频 | 国产aaa视频 | xxx性欧美 | 91福利网站 | 日韩高清在线播放 | 黄色在线免费播放 | 91视频插插插 | 国产精品无码一区二区三区在线看 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 国产精品传媒视频 | 亚洲av无码一区二区二三区 | 99re伊人 | 亚洲成人精品在线 | 日韩av在线一区二区 | 日韩av在线播放一区 | 国产91啪 | 黑人玩弄人妻一区二区三区四 | 黄色一毛片 | 亚洲欧洲日韩国产 | 日韩视频一区二区在线观看 | 国产xxxx | 亚洲av无码成人精品国产 | 九九热在线视频免费观看 | 激情开心站 | 又污又黄的网站 | 精品国产九九 | 欧美二区在线观看 | 久久亚洲第一 | 久草国产在线观看 | av影院在线观看 | 人妻饥渴偷公乱中文字幕 | 四虎av影院 | 久久精品大全 | 日本免费观看视频 | 国产精选久久久 | 草草在线影院 | 蜜桃99视频一区二区三区 | 久久久久久国产精品免费播放 | 久久国产精品亚洲 | 牛人盗摄一区二区三区视频 | 少妇又色又紧又黄又刺激免费 | 日韩精品在线免费观看视频 | av天天操 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 日韩成人在线看 | 久草不卡 | 日本zzjj | 亚洲欧美在线一区二区 | 免费在线黄色av | 宅男深夜视频 | 国产精品免费视频一区二区 | 久久两性视频 | 自拍偷拍第二页 | 人妻巨大乳hd免费看 | 玖玖免费 | 免费在线观看日韩av | 日本www免费 | 最近更新中文字幕 | 美女上床网站 | 三级国产在线观看 | 天天操天天草 | 日日干日日插 | 女人毛片视频 | 成人一级大片 | ass精品国模裸体欣赏pics | 欧美zozo| 狠狠躁18三区二区一区传媒剧情 | 精品成人 | 日本一区二区精品视频 |