開發者學堂課程【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() 又占着其它的強引用的對象不放,那麼我們就會出現一個邏輯上的死鎖,是以這個時候就可以用引用來解決。