天天看點

對象引用 | 學習筆記

開發者學堂課程【Java 面試疑難點串講1:面試技巧及語言基礎:對象引用】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/24/detail/501

對象引用

内容介紹

一、記憶體配置設定

二、垃圾回收

從 JDK 1.2 開始實際上就提出有四種引用關系:強引用、軟引用、弱引用、虛引用。

很多的時候你可能并不需要你再去編寫這樣的代碼,但是對于這些概念你必須清楚。

1、強引用:對象将一直被進行引用,即使出現了“OutOfMemeryError”錯誤資訊。

package cn.mldn.demo; public class TestRefDemo ( public static void main(String[] args) { Object obj = new Object(); //

執行個體化對象Object ref = obj;//強引用,預設的狀态就屬于強引用狀态obj = null; //原始的對象斷開引用,但是ref依然引用着System.gc();//垃圾收集

System.out.println(ref);

1、軟引用:

對象将被盡可能長時間的儲存,一直到出現記憶體不足的情況下才會被回收,是以這樣的操作很多時候将其用于緩存的開發上,

例如,在 MyBatis.裡面就提供有對于軟引用模式的緩存模式。

package cn.mldn.demo; import java.lang.ref.SoftReference; public class TestRefDemo { public static void main(String[] args) { Object obj = new Object(); //

執行個體化對象//發生了一個軟引用SoftReference<object> ref = new SoftReference<object>(obj);

obj = null ; // 

斷開連接配接System.gc();//進行垃圾收集System.out.println(ref.get());

注:如果說這個時候出現了記憶體不足的問題,那麼才會進行回收,也就是說對象會盡可能的儲存時間長一些。

2.  弱引用:

一旦有了垃圾收集操作之後就會進行回收。

package cn.mldn.demo; import java.util.Map; import java.util.WeakHashMap; public class TestRefDemo { public static void main(String[] args) { String str = newString("

極限IT") ; 0bject obj= new 0bject();//執行個體化對象Map<String,0bject> map= new WeakHashMap<String ,0bject>() ;

map.put(str, obj) ; //

追加了弱引用System.out.println("GC執行之前"+map.get(str));

str = System.gc(); System.out.println("GC

執行之後" + map.get(str));

3.虛引用(幽靈引用),這種操作傳回的内容永遠都是 null ,就是不引用;

package cn.mldn.demo; import java.lang.ref.PhantomReference;

import java.lang.ref.ReferenceQueue; public class TestRefDemo { public static void main(String[] args) { Object obj = new0bject(); ReferenceQueue<0bject> queue = new ReferenceQueue<0bject>();

PhantomReference<0bject> pr = new PhantomReference<0bject>(object)

System.gc(); System.out.println(pr·get());

注:在對象垃圾收集前一定會調用 finalize() 方法,但是如果說 finalize() 又占着其它的強引用的對象不放,那麼我們就會出現一個邏輯上的死鎖,是以這個時候就可以用引用來解決。