解析Java中的四種引用

1. 強引用---即使是內存不足,垃圾回收器也不會回收被強引用的對象的內存。(會報OOM異常)

2. 軟引用---只有在內存快溢出的時候,垃圾回收器纔會回收被其引用的對象的內存。軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關聯的引用隊列中。適合用來實現緩存:比如網頁緩存、圖片緩存等。

        SoftReference<String> sr = new SoftReference<String>(new String("hello"));
        System.out.println(sr.get());

3. 弱引用--每次GC都會回收的其引用的對象的內存(前提是該對象沒有被其它強引用引用)。使用弱引用的對象一般都是有價值被cache的,而且很容易被構建很消耗內存的對象。3.1  ReferenceQueue--在weak reference指向的對象被回收後, weak reference本身其實也就沒有用了. java提供了一個ReferenceQueue來保存這些所指向的對象已經被回收的reference. 用法是在定義WeakReference的時候將一個ReferenceQueue的對象作爲參數傳入構造函數.

Car car = new Car(22000,"silver");

WeakReference<Car> weakCar = new WeakReference<Car>(car);

注:weakCar.get()方法來返回值爲null的時候說明指向的對象被回收成功

--------------------------------------------

4. 虛引用--被其引用的對象相當於沒有被引用關聯,任何時候都可能被垃圾回收器回收。虛引用必須和引用隊列關聯使用,當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之 關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動,進行一些系統通知之類的

5. 軟引用適合用來進行緩存,當內存不夠時能讓JVM回收內存,弱引用能用來在回調函數中防止內存泄露。因爲回調函數往往是匿名內部類,隱式保存有對外部類的引用,所以如果回調函數是在另一個線程裏面被回調,而這時如果需要回收外部類,那麼就會內存泄露,因爲匿名內部類保存有對外部類的強引用

6.使用的廣泛度     強引用>軟,弱引用>虛引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章