日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Android中深入學(xué)習(xí)對(duì)象的四種引用類型(強(qiáng)引用、軟引用、弱引用、虛引用)

[[429600]]

前言

Java中,一切被視為對(duì)象,引用則是用來(lái)操縱對(duì)象的;在JDK1.2就把對(duì)象引用分為四種級(jí)別,從而使程序能更靈活控制它的生命周期,級(jí)別由高到底依次為:強(qiáng) > 軟 > 弱 > 虛引用;而GC垃圾回收器(Garbage Collection)對(duì)不同的類型有著不同的處理方法,了解這些處理方式有助于我們寫出更高質(zhì)量的代碼。

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

今天我們就來(lái)學(xué)習(xí)下:

一、引用詳解

1、強(qiáng)引用 StrongReference

強(qiáng)引用是使用最普遍的引用。如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足,Java 虛擬機(jī)寧愿拋出 OutOfMemoryError 錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題。如代碼 String s=”abc” 中變量 s 就是字符串對(duì)象”abc” 的一個(gè)強(qiáng)引用。只要你給強(qiáng)引用對(duì)象 s 賦空值 null, 該對(duì)象就可以被垃圾回收器回收;因?yàn)樵搶?duì)象此時(shí)不再含有其他強(qiáng)引用;

 
 
 
 
  1. //str表示強(qiáng)引用,指向new String()這個(gè)對(duì)象 
  2. String str = new String(); 

2、弱引用

弱引用(WeakReference)是弱于軟引用的引用類型,與軟引用類似,不同的是弱引用不能阻止垃圾回收,在垃圾回收機(jī)制運(yùn)行時(shí),如果一個(gè)對(duì)象的引用是弱引用的話,不管內(nèi)存空間是否足夠,對(duì)象都會(huì)被回收。弱引用常常被用于防止內(nèi)存泄漏,最常見(jiàn)的是單例和Handler造成的內(nèi)存泄漏;

 
 
 
 
  1. //弱引用實(shí)例 
  2. WeakReference weakReference = new WeakReference<>(context); 
  3. //獲取弱引用保存的引用 
  4. Context ctx = weakReference.get(); 

3、軟引用

SoftReference:軟引用–>當(dāng)虛擬機(jī)內(nèi)存不足時(shí),將會(huì)回收它指向的對(duì)象;需要獲取對(duì)象時(shí),可以調(diào)用get方法;

軟引用對(duì)象不會(huì)很快被jvm回收,jvm 會(huì)根據(jù)當(dāng)前堆的使用情況來(lái)判斷何時(shí)回收,當(dāng)堆的使用頻率接近閥值時(shí)才會(huì)被回收;

基本用法

 
 
 
 
  1. MySoftReference msf = new MySoftReference(); 
  2.   SoftReference sf = new SoftReference(msf); 
  3.   MySoftReference mySoftReference =(MySoftReference) sf.get(); 

基本特點(diǎn)

  • 如果內(nèi)存足夠,軟引用是不會(huì)被jvm回收的;
  • 如果內(nèi)存不夠,會(huì)根據(jù)堆棧的使用情況來(lái)回收引用;
  • 未被回收的軟引用是一直可被程序占有的;
  • 軟引用可以和引用隊(duì)列(ReferenceQueue)聯(lián)合使用來(lái)實(shí)現(xiàn)內(nèi)存緊張的高速緩存;
  • 如果軟引用引用的對(duì)象被回收,Java虛擬機(jī)會(huì)把改軟引用對(duì)象加到與之關(guān)聯(lián)的引用隊(duì)列中;
 
 
 
 
  1. ReferenceQueue rq = new ReferenceQueue(); 
  2.              SoftReference sf = new SoftReference(msf,rf); 

當(dāng)軟引用對(duì)象被回收后,ReferenceQueue隊(duì)列中存儲(chǔ)著強(qiáng)引用的Reference,然后可通過(guò)poll()來(lái)判斷當(dāng)前引用隊(duì)列是否有失去軟引用的對(duì)象,如果隊(duì)列為空,將返回一個(gè)null,否則該方法返回隊(duì)列中前面的一個(gè)Reference對(duì)象。可以檢測(cè)出哪個(gè)軟引用對(duì)象被回收,然后將其清除;

 
 
 
 
  1. Reference reference =null; 
  2.            while((reference==(EmployeeRef)rq.poll())){ 
  3.                    //清除操作 
  4.                    reference =null; 
  5.                     System.gc(); 
  6.                } 

4、虛引用

虛引用(PhantomReference)是最弱的引用,一個(gè)持有虛引用的對(duì)象和沒(méi)有引用幾乎是一樣的,隨時(shí)都可能被垃圾回收器回收。通過(guò)虛引用的get()方法獲取到的引用都會(huì)失敗(為null),虛引用必須和引用隊(duì)列ReferenceQueue一起使用;

ReferenceQueue引用隊(duì)列作用在于跟蹤垃圾回收過(guò)程。當(dāng)垃圾回收器回收對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收后銷毀這個(gè)對(duì)象,并且將虛引用指向的對(duì)象加入到引用隊(duì)列。只能通過(guò)虛引用是否被加入到ReferenceQueue來(lái)判斷虛引用是否為GC回收,這也是判斷對(duì)象是否為回收的唯一途徑;

Java的Object類中有finalize()方法,原理:一旦垃圾回收器準(zhǔn)備釋放對(duì)象占用的內(nèi)存空間,將首先調(diào)用finalize()方法,并且在下一次垃圾回收動(dòng)作發(fā)生時(shí),才會(huì)真正回收對(duì)象占用的內(nèi)存,但是問(wèn)題在于,虛擬機(jī)不能保證finalize()何時(shí)被調(diào)用,因?yàn)镚C運(yùn)行時(shí)間不是固定的;

使用虛引用就能解決這個(gè)問(wèn)題,虛引用主要用于跟蹤垃圾被回收的活動(dòng),主要用來(lái)實(shí)現(xiàn)比較精細(xì)的內(nèi)存使用控制,這對(duì)Android來(lái)說(shuō)很有意義;

 
 
 
 
  1. //引用隊(duì)列 
  2. ReferenceQueue queue = new ReferenceQueue<>(); 
  3. //虛引用 
  4. PhantomReference phantomReference = new PhantomReference(new Object(), queue); 
  5. Log.e(TAG, "虛引用:PhantomReference == " + phantomReference.get()); 
  6. //系統(tǒng)垃圾回收 
  7. System.gc(); 
  8. System.runFinalization(); 

phantomReference.get()獲取的引用一直為null,調(diào)用系統(tǒng)回收垃圾,queue.poll()獲取保存的引用對(duì)象,并且把它在這個(gè)隊(duì)列中移除;

虛引用無(wú)法通過(guò)get()方法獲取目標(biāo)的引用,一直都是返回null,源碼:

 
 
 
 
  1. public T get() { 
  2.     return null; 

總結(jié)

  • 強(qiáng)引用(StrongReference):不會(huì)自動(dòng)回收,最難被GC回收的,寧可拋出異常也不回收強(qiáng)引用指向的對(duì)象;任何場(chǎng)景;
  • 軟引用(SoftReference):內(nèi)存不足時(shí),GC會(huì)回收軟引用指向的對(duì)象比較少使用,已被LruCache替代;
  • 弱引用(WeakReference):不管內(nèi)存足不足,只要GC了都能回收弱引用指向的對(duì)象;常用于避免內(nèi)存泄漏;
  • 虛引用(PhantomReference):隨時(shí)都能回收,也稱幽靈引用,相當(dāng)于沒(méi)有指向任何實(shí)例引用;跟蹤對(duì)象是否被回收,很少使用。

本文轉(zhuǎn)載自微信公眾號(hào)「Android開(kāi)發(fā)編程」


網(wǎng)站標(biāo)題:Android中深入學(xué)習(xí)對(duì)象的四種引用類型(強(qiáng)引用、軟引用、弱引用、虛引用)
新聞來(lái)源:http://m.5511xx.com/article/djhsjhe.html