自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android中深入學習對象的四種引用類型(強引用、軟引用、弱引用、虛引用)

移動開發(fā) Android
Java中,一切被視為對象,引用則是用來操縱對象的;在JDK1.2就把對象引用分為四種級別,從而使程序能更靈活控制它的生命周期,級別由高到底依次為:強 > 軟 > 弱 > 虛引用。

[[429600]]

前言

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

今天我們就來學習下:

一、引用詳解

1、強引用 StrongReference

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

  1. //str表示強引用,指向new String()這個對象 
  2. String str = new String(); 

2、弱引用

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

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

3、軟引用

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

軟引用對象不會很快被jvm回收,jvm 會根據(jù)當前堆的使用情況來判斷何時回收,當堆的使用頻率接近閥值時才會被回收;

基本用法

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

基本特點

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

當軟引用對象被回收后,ReferenceQueue隊列中存儲著強引用的Reference,然后可通過poll()來判斷當前引用隊列是否有失去軟引用的對象,如果隊列為空,將返回一個null,否則該方法返回隊列中前面的一個Reference對象??梢詸z測出哪個軟引用對象被回收,然后將其清除;

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

4、虛引用

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

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

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

使用虛引用就能解決這個問題,虛引用主要用于跟蹤垃圾被回收的活動,主要用來實現(xiàn)比較精細的內(nèi)存使用控制,這對Android來說很有意義;

  1. //引用隊列 
  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()獲取保存的引用對象,并且把它在這個隊列中移除;

虛引用無法通過get()方法獲取目標的引用,一直都是返回null,源碼:

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

總結(jié)

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

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

 

責任編輯:姜華 來源: Android開發(fā)編程
相關(guān)推薦

2020-12-02 09:01:40

Java基礎(chǔ)

2024-05-20 08:58:13

Java引用類型垃圾回收器

2013-08-19 17:14:04

.Net強引用弱引用

2009-06-19 16:19:23

Java對象引用

2019-10-24 07:42:28

Java引用GC

2011-11-24 16:34:39

Java

2013-09-16 16:48:50

Android優(yōu)化軟引用

2023-03-30 07:55:02

2009-09-11 11:09:36

C#引用類型

2016-09-18 19:07:33

Java值傳遞引用傳遞

2015-11-02 17:20:00

Java弱引用

2018-11-16 16:10:28

JavaOOM編程語言

2021-01-07 14:20:55

JavaGC

2020-11-10 08:45:35

Python

2021-10-08 21:00:52

數(shù)據(jù)弱引用對象

2022-03-08 13:06:25

引用隊列jvm變量

2021-06-15 19:30:34

JAVA虛引用對象

2009-09-09 09:36:25

Linq對象引用

2009-08-14 17:09:48

C#引用類型

2024-12-16 16:10:31

點贊
收藏

51CTO技術(shù)棧公眾號