在JDK1.2以後將對象應用分為4中,強引用,軟引用,弱引用,虛引用,這樣的方式可以更加靈活控制對象的聲明周期 強引用 String str = "123"; 這時我們日常用的引用,只要對象與強引用關聯,如果記憶體不足時,JVM寧願拋出OutOfMemoryError記憶體溢出錯誤也不會回收強引用 如果 ...
在JDK1.2以後將對象應用分為4中,強引用,軟引用,弱引用,虛引用,這樣的方式可以更加靈活控制對象的聲明周期 強引用 String str = "123"; 這時我們日常用的引用,只要對象與強引用關聯,如果記憶體不足時,JVM寧願拋出OutOfMemoryError記憶體溢出錯誤也不會回收強引用 如果想要JVM回收強引用類型的對象,將其引用更改為null,JVM會在合適的時間回收這個null引用隊形 軟引用 java中使用softRefence來表示軟引用,如果某個對象與軟引用關聯,那麼JVM只有在記憶體不足時回收該類引用 利用這個特性軟引用可以用來做緩存 例如:
SoftReference<String> srs = new SoftReference<String>("123"); System.out.println(srs.get()); //123 System.gc(); System.out.println(srs.get());//123
因為記憶體充足所有無法回收 軟引用適合做緩存,在記憶體足夠是,直接通過軟引用取值,無需從真實的來源中查詢數據,可以顯著的提升網站性能,當記憶體不足時,能讓JVM進行回收,從而刪除緩存,這時候只能從真實來源查詢數據 弱引用 java中使用WeackReference來表示弱引用,如果某個對象與弱引用關聯,那麼當JVM在進行垃圾回收是,無論記憶體是否充足都會回收此類對象
WeakReference<String> str = new WeakReference<String>(new String("123")); System.out.println(str.get()); // 123 System.out.println(str.getClass()); // class java.lang.ref.WeakReference //通知JVM進行記憶體回收 System.gc(); System.out.println(str.get()); //null
可以看出,被弱引用關聯的對象,在調用垃圾回收以後就會被回收, 弱引用可以在回調函數在防止記憶體泄漏,因為回調函數芳芳是匿名內部類,一個非靜態的內部類會隱式地持有外部類的一個強引用,當JVM在回收外部類的時候,此時回調函數在某個線程里被回調的時候,JVM就無法回收外部類,造成記憶體泄漏, 虛引用 java中使用PhantomReference來表示虛引用,引用就好事虛設一樣,就想某個對象沒有引用關聯一樣,若某個對象與虛引用關聯,那麼任何時候都可能被虛擬機回收,虛引用不能單獨使用,必須配合引用隊列一起使用
PhantomReference<String> ph = new PhantomReference<String>("123", new ReferenceQueue<String>()); System.out.println(ph.get()); // null
get方法沒有獲取到值, 當垃圾回收器準備回收一個對象時,如果發現它與虛引用關聯.就會在他回收以前將這個虛引用加入到引用隊列中,程式可以判斷引用隊列中是否加入了虛引用,來瞭解被引用的對象是否將要被回收,如果確實要被回收,就可以做一些回收之前的收尾工作