android內(nèi)存泄漏總結(jié)

本文主要總結(jié)Android開發(fā)中發(fā)生的內(nèi)存泄漏場景荤崇,發(fā)生的原因,以及解決方案杭攻。

目錄

  1. Java內(nèi)部類隱式持有外部類
  2. Java匿名內(nèi)部類隱式持有外部類
  3. Android的Window類持有了activity
  4. [LeakCanary提示policy.HwPhoneWindow$1.this$0的泄漏](#LeakCanary提示policy.HwPhoneWindow$1.this$0的泄漏)
  5. [Android InputMethodManager](#Android InputMethodManage)

java的gc檢查內(nèi)存回收時家夺,使用有向圖機制钝侠,及檢查一個或一組對象的可達性。如果是不可達狀態(tài)酸舍,則將該對象從內(nèi)存中回收帅韧,所謂不可達狀態(tài),也就是一個對象不被任何引用所指向或者叫持有啃勉。

另外忽舟,java的循環(huán)引用不同于oc或者c++,當(dāng)一組對象中只包含互相的引用,而沒有來自它們外部的引用(例如有兩個對象A和B互相持有引用淮阐,但沒有任何外部對象持有指向A或B的引用)叮阅,這仍然屬于不可到達,同樣會被GC回收泣特。
注意
在Android開發(fā)過程中浩姥,activity會天然的被window對象所應(yīng)用,所以在activity中與其他類循環(huán)應(yīng)用時状您,盡量使用弱引用模式勒叠,

Java內(nèi)部類隱式持有外部類

常見于ViewHolder或者new Handler,new Listener等情況

案例如下:

public class MainActivity extends AppCompatActivity {
private TestResource mResource = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
  if(mManager == null){
    mManager = new TestResource();
  }
  //...
  }

class TestResource {
  //...
  }
}

分析:
如果TestResource我們執(zhí)行了耗時操作,在銷毀Activity時膏孟,由于testResource隱藏性的指向了Activity的實例眯分,所以在testResource會執(zhí)行結(jié)束時,不會銷毀Activity柒桑,發(fā)生了內(nèi)存泄漏弊决。

解決方案:

內(nèi)部類增加static前綴,這樣就不會隱式指向外部類了幕垦。增加static前綴也相當(dāng)了新建一個java文件

static class TestResource {
  //...
  }
}

Java匿名內(nèi)部類隱式持有外部類

該案例同上書問題一樣丢氢,我們?yōu)榱朔奖銜诖罅渴褂媚涿麅?nèi)部類,而不是重新定義內(nèi)部類先改,比如在在Thread或者事件監(jiān)聽場景中疚察。

新建一個線程

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       new Thread(new Runnable(){
            @Override
            public void run() {
                
            }
        }).start();
}

分析:
此時如果發(fā)生在Activity類,比我們可以看到在run()函數(shù)可以直接調(diào)用activity的成員變量仇奶,說明這個Runnable匿名內(nèi)部類已經(jīng)持有了Activity的實例貌嫡,當(dāng)Runnable執(zhí)行耗時操作時,Activity就銷毀不掉了该溯。
解決方案:
匿名內(nèi)部類提出來岛抄,作為成員變量并增加static前綴,就解除了與外外部類的關(guān)系

static Runnable runnable = new Runnable() {
        @Override
        public void run() {
            
        }
    }

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       new Thread(runnable).start();
}

LeakCanary提示policy.HwPhoneWindow$1.this$0的泄漏

最新在華為手機GEM=703L android6.0發(fā)現(xiàn)的問題狈茉,在AsyncTask執(zhí)行ProgressDialog的顯示或隱藏夫椭,然后退出activity會發(fā)生泄漏。泄漏提示
GC ROOT com.android.internal.policy.HwPhoneWindow$1.this$0

分析過程太長了氯庆,轉(zhuǎn)移到新的文章
LeakCanary提示policy.HwPhoneWindow$1.this$0的泄漏分析

Android InputMethodManager

這中情況導(dǎo)致的內(nèi)存目前還在研究中蹭秋,先貼出大家的討論

Android InputMethodManager 導(dǎo)致的內(nèi)存泄露及解決方案

[Android][Memory Leak] InputMethodManager內(nèi)存泄露現(xiàn)象及解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扰付,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仁讨,更是在濱河造成了極大的恐慌羽莺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洞豁,死亡現(xiàn)場離奇詭異盐固,居然都是意外死亡,警方通過查閱死者的電腦和手機丈挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門刁卜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礁哄,你說我怎么就攤上這事长酗∠保” “怎么了桐绒?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長之拨。 經(jīng)常有香客問我茉继,道長,這世上最難降的妖魔是什么蚀乔? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任烁竭,我火速辦了婚禮,結(jié)果婚禮上吉挣,老公的妹妹穿的比我還像新娘派撕。我一直安慰自己,他們只是感情好睬魂,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布终吼。 她就那樣靜靜地躺著,像睡著了一般氯哮。 火紅的嫁衣襯著肌膚如雪际跪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天喉钢,我揣著相機與錄音姆打,去河邊找鬼。 笑死肠虽,一個胖子當(dāng)著我的面吹牛幔戏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播税课,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼闲延,長吁一口氣:“原來是場噩夢啊……” “哼豹缀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慨代,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邢笙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侍匙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氮惯,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年想暗,在試婚紗的時候發(fā)現(xiàn)自己被綠了妇汗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡说莫,死狀恐怖杨箭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情储狭,我是刑警寧澤互婿,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站辽狈,受9級特大地震影響慈参,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刮萌,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一驮配、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧着茸,春花似錦壮锻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澎语,卻和暖如春途事,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擅羞。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工尸变, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人减俏。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓召烂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娃承。 傳聞我的和親對象是個殘疾皇子奏夫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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

  • 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題怕篷。內(nèi)存泄漏大家都不陌生了,簡單粗俗的講酗昼,...
    宇宙只有巴掌大閱讀 2,363評論 0 12
  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題廊谓。內(nèi)存泄漏...
    _痞子閱讀 1,639評論 0 8
  • 從福建回來一年多,好像什么都沒變麻削,也好像什么都變了蒸痹。有些事情事實已經(jīng)該變變了,但更好像是自己看懂了在承受...
    兩寬各安閱讀 252評論 0 0
  • 由坤倪文化傳媒(北京)有限公司出品呛哟,白麗麗執(zhí)導(dǎo)叠荠,呂聿來主演的驚悚懸疑片《驚悚小說》近日宣布定檔4月7日,并接連發(fā)布...
    更多資訊閱讀 451評論 0 0
  • ==操作符比較的是兩個指針本身,而不是其所指的對象isEqual: 方法來判斷兩個對象的等同性 NSObject協(xié)...
    spbreak閱讀 407評論 0 0