強引用、軟引用、弱引用、虛引用的概念以及如何避免OOM錯誤
轉自http://www.cnblogs.com/dolphin0520/p/3784171.html
想必很多朋友對OOM(OutOfMemory)這個錯誤不會陌生,而當遇到這種錯誤如何有效地解決這個問題呢?今天我們就來說一下如何利用軟引用和弱引用來有效地解決程式中出現的OOM問題。下面是本文的目錄大綱:
一.瞭解 強引用、軟引用、弱引用、虛引用的概念
二.進一步理解軟引用和弱引用
三.如何利用軟引用和弱引用解決OOM問題
如果有不正之處,希望諒解和批評指正,不勝感激。
請尊重作者勞動成果,轉載請標明原文連結:
一.瞭解 強引用、軟引用、弱引用、虛引用的概念
在Java中,雖然不需要程式設計師手動去管理物件的生命週期,但是如果希望某些物件具備一定的生命週期的話(比如記憶體不足時JVM就會自動回收某些物件從而避免OutOfMemory的錯誤)就需要用到軟引用和弱引用了。
從Java SE2開始,就提供了四種類型的引用:強引用、軟引用、弱引用和虛引用。Java中提供這四種引用型別主要有兩個目的:第一是可以讓程式設計師通過程式碼的方式決定某些物件的生命週期;第二是有利於JVM進行垃圾回收。下面來闡述一下這四種類型引用的概念:
1.強引用(StrongReference)
強引用就是指在程式程式碼之中普遍存在的,比如下面這段程式碼中的object和str都是強引用:
1 2 |
Object
object = new Object();
String
str = "hello" ;
|
只要某個物件有強引用與之關聯,JVM必定不會回收這個物件,即使在記憶體不足的情況下,JVM寧願丟擲OutOfMemory錯誤也不會回收這種物件。比如下面這段程式碼:
1 2 3 4 5 6 7 8 9 10 |
public class Main
{
public static void main(String[]
args) {
new Main().fun1();
}
public void fun1()
{
Object
object = new Object();
Object[]
objArr = new Object[ 1000 ];
}
}
|
當執行至Object[] objArr = new Object[1000];這句時,如果記憶體不足,JVM會丟擲OOM錯誤也不會回收object指向的物件。不過要注意的是,當fun1執行完之後,object和objArr都已經不存在了,所以它們指向的物件都會被JVM回收。
如果想中斷強引用和某個物件之間的關聯,可以顯示地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該物件。
比如Vector類的clear方法中就是通過將引用賦值為null來實現清理工作的:
View Code2.軟引用(SoftReference)
軟引用是用來描述一些有用但並不是必需的物件,在Java中用java.lang.ref.SoftReference類來表示。對於軟引用關聯著的物件,只有在記憶體不足的時候JVM才會回收該物件。因此,這一點可以很好地用來解決OOM的問題,並且這個特性很適合用來實現快取:比如網頁快取、圖片快取等。
軟引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果軟引用所引用的物件被JVM回收,這個軟引用就會被加入到與之關聯的引用佇列中。下面是一個使用示例:
1 2 3 4 5 6 7 8 9 |
import java.lang.ref.SoftReference;
public class Main
{
public static void main(String[]
args) {
SoftReference<String>
sr = new SoftReference<String>( new String( "hello" ));
System.out.println(sr.get());
|