精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91好色先生tv| 亚洲最大成人网站| 免费网站在线观看人| 丁香网亚洲国际| 9i在线看片成人免费| 久久综合伊人77777蜜臀| 色哟哟在线观看视频| 美女视频在线免费| 国产精品久久久久精k8| 国产成人精品一区二区三区福利 | 熟女性饥渴一区二区三区| chinese偷拍一区二区三区| 国产99一区视频免费| 国产精品www| 精国产品一区二区三区a片| 国产高清不卡视频| 成人激情视频| 亚洲第一偷拍网| 亚洲 欧美 另类人妖| 3344国产永久在线观看视频| 中文字幕精品一区二区精品绿巨人| yellow视频在线观看一区二区| 中文字幕日韩免费| 激情综合视频| 久久精品影视伊人网| 男人天堂av电影| 红杏视频成人| 日韩一区二区在线免费观看| www日韩视频| www成人免费观看| 亚洲精品久久久蜜桃| 色噜噜色狠狠狠狠狠综合色一| 六月婷婷综合网| 国产伦精品一区二区三区免费迷| 国产成人精品午夜| 天天做天天爱夜夜爽| 在线国产精品一区| 操人视频在线观看欧美| 日本黄区免费视频观看| 久久99视频| 国产丝袜一区二区| 亚洲av成人精品一区二区三区 | 在线电影国产精品| 国产偷人视频免费| 日韩伦理精品| 亚洲va欧美va人人爽| 男女裸体影院高潮| 18视频在线观看| 综合久久国产九一剧情麻豆| 亚洲欧洲免费无码| 国产激情在线观看视频| 黄色在线播放| 久久久久99精品国产片| 久久综合九色综合久99| 天堂资源最新在线| 久久亚洲一区二区三区四区| 久久精品丝袜高跟鞋| 日夜干在线视频| 久久婷婷色综合| 欧美资源一区| aⅴ在线视频男人的天堂| 亚洲国产成人私人影院tom| 日韩欧美视频一区二区| 91社区在线观看| 国产精品久久久久久久裸模| 亚洲亚洲精品三区日韩精品在线视频| 91在线不卡| 亚洲色欲色欲www| 法国空姐在线观看免费| 啪啪免费视频一区| 精品国产成人在线| 亚洲爆乳无码专区| 国产a亚洲精品| 7777精品伊人久久久大香线蕉经典版下载| 日本超碰在线观看| 日本一区二区三区电影免费观看| 欧美成人一区二区三区| 中文成人无字幕乱码精品区| 亚洲人成网www| 在线视频日韩精品| 免费在线视频观看| 国产毛片一区| 国产精品嫩草影院久久久| 91影院在线播放| 国产99精品国产| 久久天堂国产精品| 欧美r级在线| 亚洲午夜电影在线观看| 久久精品.com| 国产精品日本一区二区三区在线 | 偷偷www综合久久久久久久| 成人444kkkk在线观看| 日韩精品视频免费看| 日韩av中文字幕一区二区| 亚洲一区二区三区视频| 日韩在线免费看| 亚洲欧洲一区二区在线播放| 福利视频一区二区三区四区| 秋霞国产精品| 亚洲精品在线网站| 国产三级短视频| 精品白丝av| 国产精品专区一| 视频一区二区免费| 国产精品久久久久久久久久久免费看| 成人性生活视频免费看| 韩国精品视频在线观看| 亚洲电影免费观看| 免费成人深夜夜行网站| 欧美亚洲视频| 成人区精品一区二区| eeuss影院在线播放| 欧美日韩激情网| 丰满少妇中文字幕| 日韩欧美精品综合| 欧美在线观看日本一区| а√天堂资源在线| 中文字幕一区二区三区在线播放 | 不卡高清视频专区| 国产又粗又硬又长| 日本一区二区三区视频在线| 亚洲国产欧美一区二区三区同亚洲| 999精品视频在线观看播放| 午夜亚洲性色福利视频| 国产久一道中文一区| 成人在线观看免费网站| 欧美日免费三级在线| 日韩在线免费观看av| 亚洲狼人精品一区二区三区| 91久久精品一区二区别| 米奇精品一区二区三区| 91久久人澡人人添人人爽欧美| 免费看毛片的网站| 欧美日一区二区三区在线观看国产免| 91精品久久久久久久久久另类| 黄色av网址在线免费观看| 欧美日韩国产色| 白嫩情侣偷拍呻吟刺激| 亚洲性感美女99在线| 亚洲xxx自由成熟| 精品视频在线一区二区| 欧美夫妻性生活| 无码人中文字幕| 青青草精品视频| 欧美一区少妇| 在线观看特色大片免费视频| 日韩成人久久久| 日本网站在线播放| 成人av网在线| 欧美成人一区二区在线观看| 欧美一区 二区| 91高清视频免费观看| 视频一区二区在线播放| 欧美性生交大片免费| 精品成人av一区二区三区| 久久久久在线| 特级西西444www大精品视频| 岛国精品在线| 久久久999精品视频| 国产精品玖玖玖| 亚洲乱码国产乱码精品精的特点 | 99re成人精品视频| 内射国产内射夫妻免费频道| 亚洲综合小说图片| 国产精品久久久久久久午夜| 色老头视频在线观看| 制服丝袜在线91| 久久久久亚洲AV| 99久久精品免费看国产免费软件| aa在线免费观看| 三上亚洲一区二区| 91精品天堂| 天堂а√在线最新版中文在线| 亚洲精品一区二区在线| 中文字幕一区二区在线视频| 亚洲天堂av一区| 波多野结衣加勒比| 视频一区二区中文字幕| 中文字幕剧情在线观看一区| 日韩成人在线看| 欧美整片在线观看| 黄色在线论坛| 日韩成人在线观看| 中文字幕在线播出| 亚洲小说欧美激情另类| 四虎国产精品成人免费入口| 国模大尺度一区二区三区| 日本www在线视频| 成人看的羞羞网站| 国产精品一 二 三| 成人高清一区| 久久免费少妇高潮久久精品99| 蜜桃视频在线免费| 日韩视频在线一区二区| 久久亚洲精品石原莉奈 | 波多野结衣激情| 玖玖玖免费嫩草在线影院一区| 国产精品高潮呻吟久久av无限| 在线电影福利片| 亚洲天堂网在线观看| 不卡视频在线播放| 欧美色手机在线观看| 国产午夜小视频| 国产精品九色蝌蚪自拍| 亚洲欧美视频在线播放| 国产真实乱偷精品视频免| 日本精品免费在线观看| 欧美日本三区| 一区精品视频| 九一成人免费视频| 国产伦精品一区二区三区视频免费| 黑人一区二区三区| 日韩av毛片网| aa国产成人| 欧美精品在线极品| 午夜在线小视频| 亚洲人成网站999久久久综合| 亚洲欧美激情在线观看| 欧美美女激情18p| www.久久久久久久| 午夜精品影院在线观看| 精品99久久久久成人网站免费| 中文欧美字幕免费| 中文字幕网站在线观看| 97精品久久久久中文字幕| 韩国黄色一级片| 狠狠色伊人亚洲综合成人| 日韩av片网站| 丝袜诱惑制服诱惑色一区在线观看| 美女扒开大腿让男人桶 | 97av视频在线观看| 欧美久久一级| 日本美女爱爱视频| 亚洲第一偷拍| 一本色道久久综合亚洲精品婷婷| 国产99亚洲| 欧美激情第六页| 亚洲自拍电影| 热re99久久精品国产99热| 亚洲婷婷影院| 蜜桃麻豆www久久国产精品| 欧亚精品一区| 久久九九视频| 蜜臀av免费一区二区三区| 久久青青草综合| 国产探花一区二区| 欧美不卡1区2区3区| 伊人久久大香线蕉无限次| 欧美日韩成人一区二区三区 | 亚洲精品偷拍视频| 五月天久久久| 无码人妻aⅴ一区二区三区日本| 久久久久久久久99精品大| 大桥未久一区二区| 欧美激情第10页| 成品人视频ww入口| 亚洲少妇在线| 国产视频在线视频| 蜜臀va亚洲va欧美va天堂 | 亚洲天堂男人av| 色偷偷久久人人79超碰人人澡| 天天干,天天干| 欧美日韩你懂得| 99er热精品视频| 日韩欧美国产一二三区| 高潮毛片7777777毛片| 日韩av在线网页| 国产高清视频在线观看| 日韩中文字幕网址| 日本在线观看高清完整版| 成年人国产精品| 欧美成人欧美edvon| 毛片视频网站在线观看| 日韩欧美国产免费播放| 中文字幕人妻丝袜乱一区三区| 欧美久久久久中文字幕| 亚洲黄色一级大片| 日韩精品视频观看| 天堂中文а√在线| 欧美激情一区二区三区在线视频观看 | 亚洲精品一区二区三区不| 国产高清视频在线| 欧美久久精品一级黑人c片| 国产h片在线观看| 国产精品久久久久久久久久久不卡 | 精品国产一区二区三| 国产精品一线天粉嫩av| 男女啪啪的视频| 国产农村妇女精品一二区| 可以看污的网站| 成人一区二区三区| 亚洲一二三四视频| 亚洲成人久久影院| 一级黄色片在线免费观看| 精品欠久久久中文字幕加勒比| 久久久久久久有限公司| 99久久影视| 精品人妻一区二区三区四区在线 | 欧美熟妇精品一区二区蜜桃视频 | 三级三级久久三级久久18| 亚洲成人最新网站| 亚洲中文字幕无码中文字| 狠狠色丁香婷婷综合久久片| 亚洲一级av无码毛片精品| ㊣最新国产の精品bt伙计久久| 国产成人一区二区三区影院在线| 欧美日韩精品欧美日韩精品| 少妇精品视频一区二区| 精品国产一区久久久| 625成人欧美午夜电影| 99精品在线直播| 久久激情电影| 四虎永久在线精品无码视频| 国产91色综合久久免费分享| 18啪啪污污免费网站| 午夜天堂影视香蕉久久| 99草在线视频| 日韩在线视频播放| 色豆豆成人网| 久精品国产欧美| 国产精品s色| 亚洲午夜激情影院| 国产欧美一区二区三区鸳鸯浴| 久久精品国产亚洲AV无码麻豆| 91麻豆精品91久久久久久清纯| 国内av一区二区三区| 国模精品一区二区三区色天香| 国产999精品在线观看| 亚洲欧美日韩精品综合在线观看| 久久精品午夜| 91视频啊啊啊| 五月天精品一区二区三区| 亚洲风情第一页| 欧美另类第一页| 看亚洲a级一级毛片| 在线观看成人免费| 国产精品一区二区久激情瑜伽| 日韩一卡二卡在线观看| 欧美三级电影一区| 亚洲1卡2卡3卡4卡乱码精品| 国产在线精品成人一区二区三区| 日韩精品免费| 三上悠亚av一区二区三区| 中文字幕成人在线观看| jizz国产在线| 影音先锋欧美精品| 国产精品久久亚洲不卡| 少妇精品久久久久久久久久| 日本亚洲一区二区| 538精品视频| 欧美久久久一区| 综合图区亚洲| 国产精品手机在线| 亚洲精品系列| 国产人妻人伦精品1国产丝袜| 欧美日韩一区二区在线 | 久久精品人人做| 中文字幕永久在线| 中文字幕久久久| 欧美风情在线视频| 日韩精品一区二区三区电影| 国产电影一区二区三区| 国产乡下妇女做爰毛片| 日韩精品在线观看网站| 日本精品网站| 国产欧美综合一区| 成人18精品视频| 欧美性猛交xxxx乱大交hd| 俺去亚洲欧洲欧美日韩| 亚洲国产一区二区三区网站| ww国产内射精品后入国产| 国产亚洲一区二区在线观看| 91中文字幕在线播放| 久久久免费精品视频| 久久不见久久见免费视频7| 久久国产精品国产精品| 艳妇臀荡乳欲伦亚洲一区| 亚洲人成色777777精品音频| 国产精品久久久久久超碰| 亚洲欧美日韩高清在线| 国产婷婷在线观看| 欧美亚洲日本一区| 香蕉久久aⅴ一区二区三区| 国产一区二区三区黄| 日本美女一区二区三区| 欧美日韩在线观看成人| 日韩精品免费在线| 9999精品视频| 男人日女人下面视频| 中文字幕一区二区日韩精品绯色| 日本免费网站在线观看| 国产精品揄拍500视频| 悠悠资源网久久精品| 99国产精品免费| 精品国产成人在线影院| av激情成人网| 黄色大片中文字幕| 日韩一区欧美小说| 青青九九免费视频在线| 亚洲一区国产精品|