精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java如何有效地避免OOM:善于利用軟引用和弱引用

開發 后端
想必很多朋友對OOM(OutOfMemory)這個錯誤不會陌生,而當遇到這種錯誤如何有效地解決這個問題呢?今天我們就來說一下如何利用軟引用和弱引用來有效地解決程序中出現的OOM問題。

[[249644]]

想必很多朋友對OOM(OutOfMemory)這個錯誤不會陌生,而當遇到這種錯誤如何有效地解決這個問題呢?今天我們就來說一下如何利用軟引用和弱引用來有效地解決程序中出現的OOM問題。下面是本文的目錄大綱:

一.了解 強引用、軟引用、弱引用、虛引用的概念

二.進一步理解軟引用和弱引用

三.如何利用軟引用和弱引用解決OOM問題

如果有不正之處,希望諒解和批評指正,不勝感激。

一.了解 強引用、軟引用、弱引用、虛引用的概念

在Java中,雖然不需要程序員手動去管理對象的生命周期,但是如果希望某些對象具備一定的生命周期的話(比如內存不足時JVM就會自動回收某些對象從而避免OutOfMemory的錯誤)就需要用到軟引用和弱引用了。

Java SE2開始,就提供了四種類型的引用:強引用、軟引用、弱引用和虛引用。Java中提供這四種引用類型主要有兩個目的:***是可以讓程序員通過代碼的方式決定某些對象的生命周期;第二是有利于JVM進行垃圾回收。下面來闡述一下這四種類型引用的概念:

1.強引用(StrongReference)

強引用就是指在程序代碼之中普遍存在的,比如下面這段代碼中的object和str都是強引用: 

  1. Object object = new Object();  
  2. String str = "hello"

只要某個對象有強引用與之關聯,JVM必定不會回收這個對象,即使在內存不足的情況下,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象。比如下面這段代碼: 

  1. public class Main {  
  2.    public static void main(String[] args) {  
  3.        new Main().fun1();  
  4.    }  
  5.    public void fun1() {  
  6.        Object object = new Object();  
  7.        Object[] objArr = new Object[1000]; 
  8.    }  

如果想中斷強引用和某個對象之間的關聯,可以顯示地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。  當運行至Object[] objArr = new Object[1000];這句時,如果內存不足,JVM會拋出OOM錯誤也不會回收object指向的對象。不過要注意的是,當fun1運行完之后,object和objArr都已經不存在了,所以它們指向的對象都會被JVM回收。

比如Vector類的clear方法中就是通過將引用賦值為null來實現清理工作的: 

  1. /**  
  2.     * Removes the element at the specified position in this Vector.  
  3.     * Shifts any subsequent elements to the left (subtracts one from their  
  4.     * indices).  Returns the element that was removed from the Vector.  
  5.     *  
  6.     * @throws ArrayIndexOutOfBoundsException if the index is out of range  
  7.     *         ({@code index < 0 || index >= size()})  
  8.     * @param index the index of the element to be removed  
  9.     * @return element that was removed  
  10.     * @since 1.2  
  11.     */  
  12.    public synchronized E remove(int index) {  
  13.    modCount++;  
  14.    if (index >= elementCount)  
  15.        throw new ArrayIndexOutOfBoundsException(index);  
  16.    Object oldValue = elementData[index];  
  17.    int numMoved = elementCount - index - 1;  
  18.    if (numMoved > 0)  
  19.        System.arraycopy(elementData, index+1, elementData, index,  
  20.                 numMoved);  
  21.    elementData[--elementCount] = null; // Let gc do its work  
  22.    return (E)oldValue;  
  23.    } 

2.軟引用(SoftReference)

軟引用是用來描述一些有用但并不是必需的對象,在Java中用java.lang.ref.SoftReference類來表示。對于軟引用關聯著的對象,只有在內存不足的時候JVM才會回收該對象。因此,這一點可以很好地用來解決OOM的問題,并且這個特性很適合用來實現緩存:比如網頁緩存、圖片緩存等。

軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關聯的引用隊列中。下面是一個使用示例: 

  1. import java.lang.ref.SoftReference;  
  2. public class Main {  
  3.    public static void main(String[] args) {  
  4.  
  5.        SoftReference<String> sr = new SoftReference<String>(new String("hello"));  
  6.        System.out.println(sr.get());  
  7.    }  

3.弱引用(WeakReference)

弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。在java中,用java.lang.ref.WeakReference類來表示。下面是使用示例: 

  1. import java.lang.ref.WeakReference;  
  2. public class Main {  
  3.    public static void main(String[] args) {   
  4.        WeakReference<String> sr = new WeakReference<String>(new String("hello"));  
  5.  
  6.        System.out.println(sr.get());  
  7.        System.gc();                //通知JVM的gc進行垃圾回收  
  8.        System.out.println(sr.get());  
  9.    }  

輸出結果為: 

  1. hello  
  2. null 

第二個輸出結果是null,這說明只要JVM進行垃圾回收,被弱引用關聯的對象必定會被回收掉。不過要注意的是,這里所說的被弱引用關聯的對象是指只有弱引用與之關聯,如果存在強引用同時與之關聯,則進行垃圾回收時也不會回收該對象(軟引用也是如此)。

弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關聯的引用隊列中。

4.虛引用(PhantomReference)

虛引用和前面的軟引用、弱引用不同,它并不影響對象的生命周期。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關聯,則跟沒有引用與之關聯一樣,在任何時候都可能被垃圾回收器回收。

要注意的是,虛引用必須和引用隊列關聯使用,當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之 關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。

二.進一步理解軟引用和弱引用 

  1. import java.lang.ref.PhantomReference;  
  2. import java.lang.ref.ReferenceQueue;  
  3. public class Main {  
  4.    public static void main(String[] args) {  
  5.        ReferenceQueue<String> queue = new ReferenceQueue<String>();  
  6.        PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);  
  7.        System.out.println(pr.get());  
  8.    }  

對于強引用,我們平時在編寫代碼時經常會用到。而對于其他三種類型的引用,使用得最多的就是軟引用和弱引用,這2種既有相似之處又有區別。它們都是用來描述非必需對象的,但是被軟引用關聯的對象只有在內存不足時才會被回收,而被弱引用關聯的對象在JVM進行垃圾回收時總會被回收。

在SoftReference類中,有三個方法,兩個構造方法和一個get方法(WekReference類似):

兩個構造方法: 

  1. public SoftReference(T referent) {  
  2.    super(referent);  
  3.    this.timestamp = clock 
  4.    } 
  5. public SoftReference(T referent, ReferenceQueue<? super T> q) {  
  6.    super(referent, q);  
  7.    this.timestamp = clock 
  8.    } 

 在使用軟引用和弱引用的時候,我們可以顯示地通過System.gc()來通知JVM進行垃圾回收,但是要注意的是,雖然發出了通知,JVM不一定會立刻執行,也就是說這句是無法確保此時JVM一定會進行垃圾回收的。  get方法用來獲取與軟引用關聯的對象的引用,如果該對象被回收了,則返回null。

三.如何利用軟引用和弱引用解決OOM問題

前面講了關于軟引用和弱引用相關的基礎知識,那么到底如何利用它們來優化程序性能,從而避免OOM的問題呢?

下面舉個例子,假如有一個應用需要讀取大量的本地圖片,如果每次讀取圖片都從硬盤讀取,則會嚴重影響性能,但是如果全部加載到內存當中,又有可能造成內存溢出,此時使用軟引用可以解決這個問題。

設計思路是:用一個HashMap來保存圖片的路徑 和 相應圖片對象關聯的軟引用之間的映射關系,在內存不足時,JVM會自動回收這些緩存圖片對象所占用的空間,從而有效地避免了OOM的問題。在Android開發中對于大量圖片下載會經常用到。

下面這段代碼是摘自博客:

http://blog.csdn.net/arui319/article/details/8489451 

  1. .....  
  2. private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();  
  3. <br>....  
  4. public void addBitmapToCache(String path) {  
  5.        // 強引用的Bitmap對象  
  6.        Bitmap bitmap = BitmapFactory.decodeFile(path);  
  7.        // 軟引用的Bitmap對象  
  8.        SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);  
  9.        // 添加該對象到Map中使其緩存  
  10.        imageCache.put(path, softBitmap);  
  11.    }  
  12. public Bitmap getBitmapByPath(String path) {  
  13.        // 從緩存中取軟引用的Bitmap對象  
  14.        SoftReference<Bitmap> softBitmap = imageCache.get(path);  
  15.        // 判斷是否存在軟引用  
  16.        if (softBitmap == null) {  
  17.            return null;  
  18.        }  
  19.        // 取出Bitmap對象,如果由于內存不足Bitmap被回收,將取得空  
  20.        Bitmap bitmap = softBitmap.get();  
  21.        return bitmap;  
  22.    } 

 

責任編輯:龐桂玉 來源: java版web項目
相關推薦

2020-12-02 09:01:40

Java基礎

2019-05-09 14:32:13

IT中斷災難恢復攻擊

2024-05-20 08:58:13

Java引用類型垃圾回收器

2012-09-28 15:06:43

2013-09-16 16:48:50

Android優化軟引用

2017-07-12 12:43:42

數據庫SQL

2022-09-27 15:51:51

機器翻譯AI

2021-03-15 08:40:46

數據分析波動

2009-06-19 16:19:23

Java對象引用

2013-08-19 17:14:04

.Net強引用弱引用

2021-12-12 21:36:04

Java開發代碼

2020-07-30 11:41:52

IT團隊遠程工作CIO

2025-08-06 07:37:22

2011-11-02 09:54:37

測試

2017-07-07 08:46:51

災難恢復架構

2013-06-04 10:35:55

虛擬化IT系統

2021-10-18 15:50:49

Android強引用軟引用

2009-10-13 15:38:04

CMDB

2009-02-27 14:21:01

LinuxRuby系統管理

2019-02-28 07:34:56

欺騙勒索軟件攻擊
點贊
收藏

51CTO技術棧公眾號

成人精品免费视频| 一区二区三区在线电影| 色诱视频网站一区| 日产精品久久久一区二区| 国产一区二区三区三州| 亚洲网站在线| 中文字幕欧美日韩精品| 性xxxxxxxxx| 日本欧美一区| 亚洲高清中文字幕| 国产精品夜夜夜爽张柏芝| 色一情一乱一乱一区91av| 麻豆国产欧美一区二区三区| 国模私拍一区二区三区| 999精品视频在线观看播放| 久久资源综合| 日韩情涩欧美日韩视频| 在线免费视频一区| 欧美在线极品| 亚洲一区二区偷拍精品| 亚洲精品成人三区| 天堂а在线中文在线无限看推荐| 黑人一区二区三区四区五区| 久久精品国产综合| av直播在线观看| 日本一区二区三区视频在线看 | 在线播放毛片| 成人午夜又粗又硬又大| 国产精品久在线观看| 免费无遮挡无码永久在线观看视频| 日韩高清三区| 制服丝袜激情欧洲亚洲| 99久久久无码国产精品6| 91黄色在线| 日本一区二区成人| 国产一区二区三区高清| 97精品人妻一区二区三区香蕉| 亚洲黄色成人| 精品少妇v888av| 国产精品久久久久无码av色戒| 祥仔av免费一区二区三区四区| 午夜影院久久久| 日韩欧美精品一区二区三区经典| 亚洲欧美综合一区二区| 国产91精品一区二区麻豆网站| 国产精品入口免费视| av大片免费观看| 国模吧视频一区| 久热国产精品视频| 日本黄色录像视频| 不卡在线一区二区| 国产午夜精品一区理论片飘花| 欧美一区二区免费在线观看| 日韩精品一区国产| 日韩视频在线一区二区| 涩涩网站在线看| 国产91在线精品| 欧美综合一区二区| 国语对白做受xxxxx在线中国| 欧美男人天堂| 欧美日韩在线视频一区| 国产麻花豆剧传媒精品mv在线| av中文在线资源库| 性久久久久久久久久久久| 国产高清av在线播放| 暧暧视频在线免费观看| 亚洲午夜免费福利视频| 欧美日韩不卡在线视频| 国产精品yjizz视频网| 亚洲成人动漫在线观看| 国产极品在线视频| 亚洲电影观看| 一本一道综合狠狠老| 色欲av无码一区二区人妻| 中文字幕在线官网| 欧美小视频在线观看| 日本在线观看a| 亚洲四虎影院| 69av一区二区三区| 日本中文字幕在线不卡| 99热这里只有精品首页| 日韩一区二区三区观看| 熟妇女人妻丰满少妇中文字幕| 风间由美一区二区av101| 亚洲精品久久久久| www.狠狠爱| 国产精品成人一区二区不卡| 中文字幕av在线一区二区三区| 欧美午夜欧美| 91视频在线观看| 欧美高清在线一区| 一区二区成人国产精品| 国产www视频在线观看| 亚洲午夜久久久久久久久电影网 | 色天天综合久久久久综合片| 啊啊啊国产视频| 日本欧美不卡| 日韩精品专区在线影院重磅| 黄色片视频免费观看| 欧美一区电影| 欧美国产一区二区三区| 欧美性猛交bbbbb精品| 日本伊人色综合网| 亚洲一区二区三区sesese| 人妻精品一区一区三区蜜桃91| 久久久噜噜噜久噜久久综合| 中文字幕免费高| 一二三四视频在线中文| 欧美日韩的一区二区| 少妇伦子伦精品无吗| 精品国产成人| 欧美国产日韩xxxxx| 亚洲精品91天天久久人人| 国产精品亚洲一区二区三区妖精 | 日本一区二区三区四区在线视频| 欧美 日韩 国产 在线观看| sm捆绑调教国产免费网站在线观看 | av免费在线观| 日韩欧美亚洲成人| 精产国品一二三区| 国产精品欧美在线观看| 久久99久国产精品黄毛片入口| 久久久久久少妇| 国产高清成人在线| 午夜老司机精品| 成人观看网址| 日韩一区国产二区欧美三区| 中文字幕av久久爽一区| 亚洲国产精品一区| 91精品国产综合久久男男 | 午夜精品免费在线| 爱情岛论坛亚洲自拍| 教室别恋欧美无删减版| 午夜剧场成人观在线视频免费观看| 最近中文字幕免费在线观看| a在线欧美一区| 日产精品久久久一区二区| 里番在线播放| 欧美日韩国产综合一区二区三区| 非洲一级黄色片| 国产美女一区| 国产一区二区三区四区hd| 伊人影院蕉久影院在线播放| 欧美日韩视频第一区| 国产制服丝袜在线| 欧美在线高清| 成人激情在线播放| 亚洲成人影院麻豆| 欧美日韩亚洲综合一区二区三区 | 国产精品伦一区| 男人天堂999| 国产成人av| 青草青草久热精品视频在线网站 | 日韩欧美国产高清| 国产在线观看免费视频软件| 欧美a级理论片| 久久精品国产精品国产精品污| av毛片午夜不卡高**水| 亚洲精品乱码久久久久久金桔影视 | 国产成人精品视| 日韩国产福利| 色婷婷国产精品久久包臀| 亚洲精品中文字幕在线播放| 99riav国产精品| 久久日韩精品| 亚洲人体影院| 亚洲区中文字幕| 国产乱码77777777| 中文在线一区二区| 欧美成人三级在线播放| 天天揉久久久久亚洲精品| 国产欧美在线播放| 99热国产在线中文| 精品国产一区久久| 在线观看免费av片| 中日韩av电影| 波多野结衣免费观看| 亚洲视频久久| 久久偷看各类wc女厕嘘嘘偷窃 | 久久国产亚洲| 91久久久久久久一区二区| 黄色片网站在线| 日韩美女主播在线视频一区二区三区| 久久午夜无码鲁丝片午夜精品| 9人人澡人人爽人人精品| 女人天堂av手机在线| 精品国产精品国产偷麻豆| 成人久久久久久久| 麻豆视频在线免费观看| 欧美日韩免费视频| 日本福利片在线观看| 99久久久精品免费观看国产蜜| www.国产在线播放| 视频一区欧美| 91免费国产网站| 国产福利电影在线播放| 国产一级揄自揄精品视频| 99热这里是精品| 午夜精品久久久久影视| 丁香花五月婷婷| 国产精品538一区二区在线| 日韩免费视频播放| 日韩精品免费| 国语精品中文字幕| 青青国产精品| 久久久噜噜噜久久| 亚洲色欧美另类| 7777精品伊人久久久大香线蕉的 | 亚洲色大成网站www| 欧美女孩性生活视频| 国产无遮挡又黄又爽| 国产精品污污网站在线观看 | 神马午夜在线视频| 日韩资源在线观看| 少妇精品视频一区二区| 欧美日韩精品电影| 黑人精品无码一区二区三区AV| 中文字幕一区二区三| 国产肉体xxxx裸体784大胆| 久久香蕉精品| 国产免费黄色一级片| 91欧美国产| 蜜桃视频在线观看91| 日韩在线观看中文字幕| 国产精品丝袜视频| 国产精品论坛| 欧美国产日韩一区二区三区| 桃花色综合影院| 精品久久久久久久久久久院品网| 一级一片免费看| 精品国产户外野外| 九九在线观看视频| 中文字幕av一区二区三区高| 中文字幕免费高清视频| 国产一区二区三区久久悠悠色av| 日本xxxxxxx免费视频| 亚洲精品日韩久久| 欧洲精品在线播放| 欧美国内亚洲| 中文字幕一区二区三区5566| 精品一区二区三区中文字幕老牛| 久久66热这里只有精品| 18国产精品| 成人做爽爽免费视频| 丁香久久综合| 国产精品狠色婷| 欧美专区福利免费| 欧美性资源免费| 51漫画成人app入口| 欧美日本黄视频| 午夜成年人在线免费视频| 日韩在线中文视频| 在线看免费av| 中文字幕日韩综合av| www.亚洲.com| 一个人看的www久久| 国产在线你懂得| 亚洲国产高潮在线观看| 丰满人妻一区二区三区四区53| 欧美高清激情brazzers| 99久久免费国产精精品| 欧美一级免费大片| 精品国产亚洲一区二区麻豆| 亚洲色图视频免费播放| 亚洲ⅴ国产v天堂a无码二区| 成人av在线资源网站| 黄色免费视频网站| 91视频免费看| 性欧美一区二区| 国产精品入口麻豆九色| 亚洲综合图片一区| 亚洲视频免费看| 久久国产精品波多野结衣| 亚洲一区二三区| 国产精品乱子伦| 在线一区二区视频| 中文字幕+乱码+中文乱码91| 欧美日韩一区二区在线观看| 91精品国产乱码久久久| 日韩欧美国产午夜精品| 嫩草影院一区二区| 亚洲精品影视在线观看| 你懂得网站在线| 亚洲无线码在线一区观看| chinese偷拍一区二区三区| 亚洲人成在线一二| 亚洲男同gay网站| 亚洲2020天天堂在线观看| 欧美二三四区| 91视频国产高清| 看全色黄大色大片免费久久久| 欧美高清视频一区二区三区在线观看| 欧美理论在线播放| 小泽玛利亚av在线| 免费看黄裸体一级大秀欧美| 国产一伦一伦一伦| 成人免费看视频| 中文字幕在线观看免费高清| 亚洲色图制服诱惑| 欧美三级一区二区三区| 欧美色成人综合| 亚洲爆乳无码一区二区三区| 亚洲老头同性xxxxx| 黄色成年人视频在线观看| 欧美亚洲另类激情另类| 日韩欧美激情| 国产精成人品localhost| 日韩精品一区二区久久| 999一区二区三区| 日本不卡的三区四区五区| 年下总裁被打光屁股sp| 中文字幕 久热精品 视频在线| 久久免费公开视频| 欧美日韩美女一区二区| 刘亦菲久久免费一区二区| 日韩在线精品一区| 中文字幕21页在线看| 91亚色免费| 精品久久国产| r级无码视频在线观看| 黄页网站大全一区二区| 男人操女人动态图| 精品成人av一区| 在线播放国产一区| 亚洲国产精品成人va在线观看| 香蕉视频在线免费看| 欧美在线视频观看| www国产精品| 黄色一级片网址| 美洲天堂一区二卡三卡四卡视频| 一本加勒比波多野结衣| 一区二区三区视频在线观看| 在线中文字幕网站| 国产一区二区三区在线| 色在线中文字幕| 狠狠色综合色区| 国精品一区二区| 亚洲天堂一区二区在线观看| 欧美—级在线免费片| xxxxxx国产| 91精品国产综合久久久蜜臀粉嫩| 欧美日韩国产综合视频| 97视频在线观看网址| 综合激情五月婷婷| av在线com| 国产福利视频一区二区三区| 91嫩草|国产丨精品入口| 欧美日韩高清影院| 阿v免费在线观看| 国产欧洲精品视频| 日韩一区自拍| 中文字幕在线观看第三页| 国产女人18水真多18精品一级做| 中文字幕一区在线播放| 精品视频在线播放免| 国产理论在线| 国产在线一区二区三区播放| 亚洲午夜91| 国产精品无码在线| 激情成人中文字幕| 你懂的免费在线观看视频网站| 人体精品一二三区| 在线视频亚洲专区| 亚洲性生活网站| 国产精品理伦片| 中文字幕+乱码+中文| 久久国产精品99国产精| 日韩在线成人| 亚洲熟妇av日韩熟妇在线| 久久香蕉国产线看观看99| 91黑人精品一区二区三区| 伊人久久男人天堂| 国产欧美自拍| 国产成人精品免费看在线播放| 国产剧情在线观看一区二区| 清纯粉嫩极品夜夜嗨av| 亚洲国产福利在线| 欧美羞羞视频| 中文字幕一区二区三区精彩视频| 国产精品资源站在线| 久久精品性爱视频| 精品国产一区二区三区久久影院| 交100部在线观看| 亚洲国产精品一区二区第一页 | 国产精品天美传媒| 国产又大又黄又爽| 欧美精品国产精品日韩精品| 日本欧美高清| 2025韩国理伦片在线观看| 亚洲欧美另类久久久精品2019| 国精产品乱码一区一区三区四区| 久久久久久国产| 亚洲性视频大全| 亚洲综合伊人久久| 午夜视频一区二区| 成人在线高清视频| 91高跟黑色丝袜呻吟在线观看| 亚洲精品影视| 秋霞欧美一区二区三区视频免费| 亚洲福利小视频|