標籤:java 程式開發 程式員
一、java中的四種引用簡介
1、強引用:建立對象的引用,GC拋出OOM也不回收記憶體
2、軟引用:在OOM之前回收記憶體
3、弱引用:在GC發現之後釋放記憶體
4、虛引用(幽靈引用):使用後就釋放
二、軟引用的使用
1、用途:軟引用是主要用於記憶體敏感的快取,在jvm報告記憶體不足之前會清除所有的軟引用,這樣以來gc就有可能收集軟可及的對象,可能解決記憶體吃緊問題,避免內溢出。
2、引用的選擇機制:heap中對象有強可及對象、軟可及對象、弱可及對象、虛可及對象和不可到達對象。應用的強弱順序是強、軟、弱、和虛。對於對象是屬於哪種可及的對象,由他的最強的引用決定。
public class SoftRefrenceDemo2 {public static void main(String[] args) {String abc=new String("abc"); //1 SoftReference<String> abcSoftRef=new SoftReference<String>(abc); //2 WeakReference<String> abcWeakRef = new WeakReference<String>(abc); //3 abc=null; //4 只有將對象設定為null,才可以建立軟引用對象abcSoftRef.clear();//5}}下面是建立軟用的demo:
public class SoftRefrenceDemo {public static void main(String[] args) {// 是否可以建立一個軟引用對象A?A obj = new A();SoftReference<A> sf = new SoftReference<A>(obj);// obj = null;// 2、只有將obj設定為null才可以實現軟引用對象的建立 ?if(sf!=null) {obj = sf.get();} else {obj = new A();sf = new SoftReference<A>(obj);}}}class A {}3、瀏覽器實現後退功能:當按瀏覽器上的後退鍵時是從緩衝中取出資料還是重新構建呢?看下面兩種實現策略及問題
(1)如果一個網頁在瀏覽結束時就進行內容的回收,則按後退查看前面瀏覽過的頁面時,需要重新構建
(2)如果將瀏覽過的網頁儲存到記憶體中會造成記憶體的大量浪費,甚至會造成記憶體溢出
所以使用軟引用來實現瀏覽器的緩衝可以解決上面的兩個問題。
public class SoftRefrenceDemo3 {// js裡面有一個goBack()?public static void main(String[] args) {Browser prev = new Browser(); // 擷取頁面進行瀏覽SoftReference<Browser> sr = new SoftReference<Browser>(prev); // 瀏覽完畢後置為軟引用if (sr != null) {prev = (Browser) sr.get(); // 還沒有被回收器回收,直接擷取} else {prev = new Browser(); // 由於記憶體吃緊,所以對軟引用的對象回收了sr = new SoftReference<Browser>(prev); // 重新構建}}}class Browser {}三、弱引用的demo
public class WeakRefrenceDemo {// 當GC遇到弱可及的對象時,會及時回收該對象public static void main(String[] args) {String abc=new String("abc"); WeakReference<String> abcWeakRef = new WeakReference<String>(abc); abc=null; System.out.println("before gc: "+abcWeakRef.get()); System.gc(); System.out.println("after gc: "+abcWeakRef.get()); }}
java之軟引用