1. 程式人生 > >強引用、軟引用、弱引用、虛引用的概念以及如何避免OOM錯誤

強引用、軟引用、弱引用、虛引用的概念以及如何避免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 Code

  2.軟引用(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());

相關推薦

引用引用引用引用概念以及如何避免OOM錯誤

轉自http://www.cnblogs.com/dolphin0520/p/3784171.html 想必很多朋友對OOM(OutOfMemory)這個錯誤不會陌生,而當遇到這種錯誤如何有效地解決這個問題呢?今天我們就來說一下如何利用軟引用和弱引用來有效地

jvm引用例項分析(引用使用,引用引用

強引用(Strong Reference) 強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。 publicclass StrongReferenceTes

引用引用引用引用

enc 存在 bject 永遠 足夠 列表 設置 系統通知 內存溢出 概念我們希望能描述這樣一類對象:在內存空間還足夠時,則能保留在內存之中;如果內存空間在進行垃圾收集後還是非常緊張,則可以拋棄這些對象。在JDK 1.2之後,Java對引用的概念進行了擴充,將引用分為強引用

java 談談引用引用(Strong Reference)引用(Soft Reference)引用(Weak Reference)引用(Phantom Reference))

內存 enc ID 足夠 phantom 強引用 進行 溢出 tom 簡單談談引用(摘自java虛擬機第二版 ) 署名:wander 一、四種引用   在JDK 1.2之後,Java對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟

Java基礎篇 - 引用引用引用引用

splay 查看 tla 之前 for 應用 幹貨 程序 策略 前言 Java執行GC判斷對象是否存活有兩種方式其中一種是引用計數。 引用計數:Java堆中每一個對象都有一個引用計數屬性,引用每新增1次計數加1,引用每釋放1次計數減1。 在JDK 1.2以前的版本中,若

【Java核心技術】引用引用引用幻象引用有什麼區別

在Java語言中,除了基本資料型別外,其他的都是指向各類物件的物件引用;Java中根據其生命週期的長短,將引用分為4類。 1 強引用 特點:我們平常典型編碼Object obj = new Object()中的obj就是強引用。通過關鍵字new建立的物件所關聯的引用就是強引用。 當JVM記憶體空

引用引用引用幻象引用的區別

不同的引用型別,主要體現的是物件不同的可達性狀態和對垃圾手機的影響。 強引用,就是我們最常見的普通物件y引用,只要還有強引用指向一個物件,就能表明物件還“活著”,垃圾收集器就不會碰這種物件。對於一個普通的物件,如果沒有其他的引用關係,只要超過了引用的作用域或者顯示地將相應(強)引用賦值為null

Android開發優化之的引用引用引用的使用

本文轉載至:http://www.jianshu.com/p/8488079a939b 引言 早在JDK1.2,Java就把物件的引用分為四種級別,從而使程式能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。 但是平時我們的程式碼中似乎很

Java中的四種引用型別(

為什麼需要不同的引用型別 從Java1.2開始,JVM開發團隊發現,單一的強引用型別,無法很好的管理物件在JVM裡面的生命週期,垃圾回收策略過於簡單,無法適用絕大多數場景。為了更好的管理物件的記憶體,更好的進行垃圾回收,JVM團隊擴充套件了引用型別,從最早的強引用型別增加到強、軟、弱、虛四個引用

java的引用引用引用幻象引用引用佇列總結

java的強引用、軟引用、弱引用、幻象引用,引用佇列總結 java除了原始資料型別的變數,其他所有都是引用型別。 引用分為強引用、軟引用、弱引用、幻象引用,這幾種引用影響著物件的回收 強引用 強引用:形如Object object = new Object();這樣就是典型的強引用,

Java 引用引用引用引用

參考來源:http://www.cnblogs.com/dolphin0520/p/3784171.html  感謝原作者的分享!!! 以下內容是本人在看完之後按照自己的理解複述的,僅作為學習記錄,欲知詳解請點選上面的網址。 1.強引用 示例:Object object=new

JAVA基礎:引用引用引用引用

生活 任何傻瓜都能寫出計算機可以理解的程式碼。好的程式設計師能寫出人能讀懂的程式碼。 前言 在JAVA中,開發人員不需要像C開發人員那樣手動去管理記憶體中物件的生命週期,但是如果需要某些物件具備一定的生命週期(當記憶體不足的時候可以回收一些沒有必要的物件,從而規避一些OOM的風險

Java中的引用引用引用引用

在讀ThreadLocal原始碼的時候遇到了WeakReference,然後就仔細學習引用方面的知識,現在轉載一篇部落格。。 一.瞭解 強引用、軟引用、弱引用、虛引用的概念 在Java中,雖然不需要程式設計師手動去管理物件的生命週期,但是如果希望某些物件具備一定

Java引用引用引用引用深入探討

強引用、軟引用、弱引用和虛引用深入探討 為了更靈活的控制物件的生命週期,在JDK1.2之後,引用被劃分為強引用、軟引用、弱引用、虛引用四種類型,每種型別有不同的生命週期,它們不同的地方就在於垃圾回收器對待它們會使用不同的處理方式。 引用型別在日常開發中並不常關注,也很少注意到,因此很多人忽略了它們的存在,

Java之"引用引用引用"

思考:Java中為何會有引用的概念? 思路:在Java裡,當一個物件M被建立的時候,它就被放在heap裡。當GC執行時,如果發現沒有任何引用指向物件M,M就會被回收,用以騰出記憶體空間。 總結:如果一個物件被回收,需要滿足兩個條件: 沒有任何引用指向它 觸發GC(

四種引用型別:引用引用引用引用

java中除了基本資料型別的變數(int、long等),剩下的都是引用型別的變數,一共有四種不同的引用型別。 一、強引用(Strong Reference) 強引用就是最常見的對某個物件的引用,如下程式碼變數o就是對所建立的Object物件的一個強引用。 Object

引用(案例)

前言:如果只是想避免OutOfMemory異常的發生,則可以使用軟引用。如果對於應用的效能更在意,想盡快回收一些佔用記憶體比較大的物件,則可以使用弱引用。 1.強引用(StrongReference)   強引用就是指在程式程式碼之中普遍存在的,比如下面程式碼中的

Java7 之 引用引用引用幻象引用

1、強引用(StrongReference)           強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。如下: Object o=new Object();   //  強引用       當記憶體空間不足,Java虛擬機器寧願丟擲O

引用引用引用幻象引用總結

四種引用的區別 不同的引用型別,主要體現的是:物件不同的可達性(reachable)狀態和對垃圾收集的影響 強引用(StrongReference):強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。只要還有強引用指向一個物件,就能表明物件還“活著

java中引用引用應用引用

虛引用:“虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定物件的生命週期。如果一個物件 僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。 虛引用主要用來跟蹤物件被垃圾回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列 (ReferenceQue