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.使用的廣泛度 強引用>軟,弱引用>虛引用