您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關java中弱引用的使用方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在Java里, 當一個對象被創(chuàng)建時, 它被放在內存堆里. 當GC運行的時候, 如果發(fā)現(xiàn)沒有任何引用指向該對象, 該對象就會被回收以騰出內存空間。
或者換句話說, 一個對象被回收, 必須滿足兩個條件:
1)沒有任何引用指向它
2)GC被運行。
Java對于簡單的情況, 手動置空是不需要程序員來做的, 因為在java中, 對于簡單對象, 當調用它的方法執(zhí)行完畢后, 指向它的引用會被GC回收,
實際中我們寫代碼,往往是通過把所有指向某個對象的referece置null實現(xiàn),如:
Person p = new Person("張三",18,"男");//強引用 ... p=null;//不再使用的時候置null
很明顯,手動置null對象對于程序員來說, 是一件繁瑣且違背自動回收機制的。
Java對于簡單的情況, 如方法中的產生的局部對象,是不需要程序員來手動置空, 當調用它的方法執(zhí)行完畢后, 指向它的引用會被GC回收。
而復雜一點的情況,比如使用cache,因為cache的對象正是程序運行需要的,那么只要程序正在運行, cache中的引用就不會被GC,那么隨著cache中的引用越來越多, GC無法回收的對象也越來越多,無法被自動回收,此時就必須有開發(fā)者來進行處理回收,顯然也違背了java自動回收機制。
對此,java中引入了弱引用(WeakReference)。
當一個對象僅僅被weak reference指向, 而沒有任何其他strong reference指向的時候, 如果GC運行, 那么這個對象就會被回收。如果存在強引用同時與之關聯(lián),則進行垃圾回收時也不會回收該對象。
WeakReference的語法:
WeakReference<T> weakReference = new WeakReference<T>(referent);
當要獲得weak reference引用的對象時, 首先需要判斷它是否已經被回收:
weakReference.get();
如果此方法為空, 那么說明weakReference指向的對象已經被回收了。
下面一個WeakReference的栗子:
Person類:
package com.yx.test.model; /** * Person * * @author yx * @date 2019/11/26 16:28 */ public class Person { private String name; private int age; private String sex; public Person() { } public Person(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
測試類TestWeakReference:
package com.yx.test.reference; import com.yx.test.model.Person; import java.lang.ref.WeakReference; /** * TestWeakReference * * @author yx * @date 2019/11/26 16:30 */ public class TestWeakReference { public static void main(String[] args) { Person p = new Person("張三",18,"男"); WeakReference<Person> weakPerson = new WeakReference<Person>(p); int i=0; while(true){ if(weakPerson.get()!=null){ i++; System.out.println("Object is alive for "+i+" loops - "+weakPerson); }else{ System.out.println("Object has been collected."); break; } } } }
運行結果:
p is alive for 1 loops - java.lang.ref.WeakReference@330bedb4 ... p is alive for 62331 loops - java.lang.ref.WeakReference@330bedb4 p is alive for 62332 loops - java.lang.ref.WeakReference@330bedb4 p has been collected.
可以看到,在while循環(huán)執(zhí)行數(shù)萬次后,p被回收了。
多次測試運行程序,發(fā)現(xiàn)p回收時循環(huán)執(zhí)行的次數(shù)是不確定的,這個很容易理解:因為這是由GC運行的不確定性所確定的。
關于java中弱引用的使用方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。