Android性能優(yōu)化-單例所引起的內(nèi)存泄露

前言:本篇文章如題,講解關(guān)于性能優(yōu)化中央串,使用單例模式所引起的內(nèi)存泄露得原因及解決方法在Android Studio中通過報表查看引用樹谎替,下面開始正題;**

什么是內(nèi)存泄露:

簡單的說:當(dāng)一個對象已經(jīng)不被使用蹋辅,本應(yīng)當(dāng)別回收,但被另一個正在使用的對象所吃用挫掏,導(dǎo)致該對象無法被回收侦另;
更多的關(guān)于內(nèi)存泄露的描述請超看相關(guān)文章https://yq.aliyun.com/articles/3009

單例模式的隱患

下面是一段單例代碼:

    private static CommUtils instance;
    private Context context;
    public CommUtils(Context context) { 
         this.context = context;  
     }  
    public static CommUtils getInstance(Context context){ 
       if (instance == null){ 
           instance = new CommUtils(context);
        }  
      return instance;
    }
}```

****

>**該類在MainActivity中的使用如下代碼:**
```public class PerformsActivity{
      @override
      protected void onCreate(Bundle saveInstanceState){
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_performs);
           CommUtils commUtils = CommUtils.getInstance(this);
      }
}```
 
    

####上面的這段代碼是我們在寫單例的時候經(jīng)常寫的,但是在這個單例的使用是存在內(nèi)存泄露風(fēng)險的;
>原因是:當(dāng)手機進行橫豎屏切換的時候或者Activity過多內(nèi)存使用緊張的時候褒傅,系統(tǒng)銷毀Activity弃锐,但在這個時候該Activity被CommUtils工具類所持有,導(dǎo)致Activity無法被系統(tǒng)回收從而導(dǎo)致內(nèi)存泄露

####我們通過Android Studio的Android Monitor工具來查看Activity的回收情況###

![啟動進入Activity內(nèi)存使用情況.png](http://upload-images.jianshu.io/upload_images/2056505-721687f814e1a158.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>通過Android Monitor使用了的內(nèi)存為:17.09MB  空閑2.61MB

####此時進行橫豎屏切換

![切換后的內(nèi)存使用情況.png](http://upload-images.jianshu.io/upload_images/2056505-e5530d2073dc0258.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>此時使用的內(nèi)存為:18.16MB   空閑:2.36MB

**在Android Monitor的左上角有一個Dump Java Heap的按鈕殿托;該按鈕是快照按鈕對當(dāng)前應(yīng)用的對象狀態(tài)進行一次記錄霹菊;在點擊左側(cè)的Captures對快照進行查看和分析;**
![進行快照.png](http://upload-images.jianshu.io/upload_images/2056505-194e6d0dcae71e5c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####此時在橫豎屏切換前后進行兩次快照并對快照進行查看


![第一次快照進行超看.png](http://upload-images.jianshu.io/upload_images/2056505-9b1cd3cd41b74941.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


![對第二次快照進行查看.png](http://upload-images.jianshu.io/upload_images/2056505-9a6bf5fd1fe6af6a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>在第一次快照中的Instance中我們看到PerformsActivity的實例有一個支竹;第二次快照中 Instance中PerformsActivity實例有兩個旋廷,點擊兩個實例可以查看到該實例的引用樹,該實例被CommUtils所持有從而導(dǎo)致內(nèi)存泄露礼搁;

####如何解決
>有兩種方式解決該單例所導(dǎo)致的內(nèi)存泄露饶碘;第一種方式是使用全局的Application上下文Context參數(shù)使用CommUtils,第二種方式使用弱引用的方式解決代碼如下:

####一.使用全局Application上下文:
```public class PerformsActivity{
      @override
      protected void onCreate(Bundle saveInstanceState){
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_performs);
           CommUtils commUtils = CommUtils.getInstance(getApplicationContext());
      }
}```
####二.使用靜態(tài)變量的弱引用

```public class CommUtils { 
    private static WeakReference<CommUtils> WeakReferenceInstance;
    private Context context;
    public CommUtils(Context context) { 
         this.context = context;  
     }  
    public static CommUtils getInstance(Context context){ 
       if (WeakReferenceInstance == null || WeakReferenceInstance.get() == null) {
           WeakReferenceInstance = new WeakReference<CommUtils>(new CommUtils(context));
        }  
      return WeakReferenceInstance.get();
    }
}```

**如發(fā)現(xiàn)錯誤,請指正B狻扎运!**
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饮戳,隨后出現(xiàn)的幾起案子豪治,更是在濱河造成了極大的恐慌,老刑警劉巖扯罐,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件负拟,死亡現(xiàn)場離奇詭異,居然都是意外死亡篮赢,警方通過查閱死者的電腦和手機齿椅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來启泣,“玉大人涣脚,你說我怎么就攤上這事×让#” “怎么了遣蚀?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纱耻。 經(jīng)常有香客問我芭梯,道長,這世上最難降的妖魔是什么弄喘? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任玖喘,我火速辦了婚禮,結(jié)果婚禮上蘑志,老公的妹妹穿的比我還像新娘累奈。我一直安慰自己贬派,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布澎媒。 她就那樣靜靜地躺著搞乏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪戒努。 梳的紋絲不亂的頭發(fā)上请敦,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音储玫,去河邊找鬼侍筛。 笑死,一個胖子當(dāng)著我的面吹牛缘缚,可吹牛的內(nèi)容都是我干的勾笆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桥滨,長吁一口氣:“原來是場噩夢啊……” “哼窝爪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起齐媒,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒲每,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喻括,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邀杏,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年唬血,在試婚紗的時候發(fā)現(xiàn)自己被綠了望蜡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拷恨,死狀恐怖脖律,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腕侄,我是刑警寧澤小泉,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冕杠,受9級特大地震影響微姊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜分预,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一兢交、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笼痹,春花似錦配喳、人聲如沸飘诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纺座,卻和暖如春息拜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背净响。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工少欺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馋贤。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓赞别,卻偏偏與公主長得像,于是被迫代替她去往敵國和親配乓。 傳聞我的和親對象是個殘疾皇子仿滔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏...
    _痞子閱讀 1,637評論 0 8
  • ###集合類泄漏 集合類如果僅僅有添加元素的方法犹芹,而沒有相應(yīng)的刪除機制崎页,導(dǎo)致內(nèi)存被占用。如果這個集合類是全局性的變...
    RunningTeemo閱讀 575評論 0 0
  • 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題腰埂。內(nèi)存泄漏大家都不陌生了飒焦,簡單粗俗的講,...
    宇宙只有巴掌大閱讀 2,363評論 0 12
  • 前言 對于內(nèi)存泄漏屿笼,我想大家在開發(fā)中肯定都遇到過牺荠,只不過內(nèi)存泄漏對我們來說并不是可見的,因為它是在堆中活動驴一,而要想...
    EsonJack閱讀 892評論 1 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理休雌,服務(wù)發(fā)現(xiàn),斷路器蛔趴,智...
    卡卡羅2017閱讀 134,657評論 18 139