Android性能優(yōu)化之內存泄漏

內存泄漏:內存單元使用完成后未釋放谈喳,未回收。
理解強弱引用和gc垃圾回收機制后叁执,會更好的理解內存泄漏問題。

在目前的Android項目中谈宛,內存泄漏是無法避免的,在編寫代碼時要是否產生了內存泄漏吆录。內存泄露中要注意對象、變量等的回收時刻恢筝。
在內存泄露中,雖然存在gc回收機制撬槽,還是要搞明白,你聲明的東西是何時創(chuàng)建的侄柔,何時回收的。簡單來說暂题,就是要知曉生命周期,了解越多這樣的知識纵苛,對你的代碼理解力就會有越多的提升。

一.static引發(fā)的內存泄漏:

在單例模式下攻人,我們通常都會使用static修飾我們的對象,所以這里就要講一下static所修飾的內容的生命周期了贝椿。

static:強調一下static修飾的內容通常是不會被gc系統(tǒng)回收的陷谱,所以該內容就會一直存在在系統(tǒng)中烙博,那么,static總是會有銷毀的時候吧:
Lifetime of a static variable: A static variable comes into existence when a class is loaded by the JVM and dies when the class is unloaded烟逊,if you create an android application and initialize a static variable, it will remain in the JVM until one of the following happens:

  1. the class is unloaded
  2. the JVM shuts down
  3. the process dies
    1.類被卸載的時刻。
    2.JVM虛擬機關機的時刻乔宿。
    3.進程被kill的時刻。
    那么也就說static所修飾的內容和程序的生命周期是相關的详瑞。

接下來要說的東西就很好理解了:

1.單例模式的內存泄漏

一些單例模式中初始化時會傳入context;當你傳入Activity/Fragment的contenxt時坝橡;在該Activity/Fragment關閉,要被回收的時候计寇,單例類還是會持有對Activity/Fragment的context引用锣杂,那么該Activity/Fragment就不會被回收番宁,這樣就造成了內存的泄漏。所以最好的解決辦法是 傳入Application的context即可蝶押,Application就是程序,他的context就是程序的context棋电,所以與static的生命周期相同。例:getApplicationContext()离陶。

2.非靜態(tài)內部類創(chuàng)建靜態(tài)實例造成的內存泄漏

內部類的最好優(yōu)勢就是默認會持有外部類的引用,而當你用這個非靜態(tài)內部類創(chuàng)建了一個靜態(tài)實例招刨,那么麻煩來了,因為這個類并非靜態(tài)類沉眶,所以這個類是可以被回收的,但是靜態(tài)實例一值保持著對該非靜態(tài)類的引用柳击,造成了非靜態(tài)內部類不能被回收,因為非靜態(tài)內部類是不能脫離所屬類而單獨存活的捌肴,那么也就導致了外部類不能被回收,內存泄漏就產生了状知。解決辦法當然是加上static,將非靜態(tài)內部類變成靜態(tài)內部類饥悴,靜態(tài)內部類不依賴外部類,他們擁有不同的生命周期西设。

1).單例模式的靜態(tài)內部類,這種寫法的單例模式是最推薦使用的單例模式(詳細可查看《Android源碼設計模式解析與實戰(zhàn)》)贷揽。
public class AppContext {

    public static AppContext getInstance() {
        return SingletonHolder.instance;
    }
    /**
     * 靜態(tài)內部類的單例模式
     */
    private static class SingletonHolder{
        private static final AppContext instance = new AppContext();
    }
}
2).線程中的的內存泄漏

也可以歸到內部類的靜態(tài)使用。
線程的方式有Handler擒滑、AsyncTask叉弦、Thread等方式丐一。
其中所有的線程方式在Activity中都是內部類的方式存在的淹冰,所以一般為了避免內存泄漏,都將這些線程實行靜態(tài)內部類的方法樱拴。在Activity被銷毀的時候,將線程關閉晶乔,清空線程中的任務。

所以一定要慎用static正罢,在使用時要考慮到是否產生了內存泄漏。

二翻具、資源未關閉產生的內存泄漏

這個就簡單了,在使用BraodcastReceiver裆泳,ContentObserver,File工禾,Cursor,Stream闻葵,Bitmap等后,要記得對資源進行手動回收洪灯,就避免了內存泄露。

這里對內存泄露進行了簡單的分析,推薦好的博客:
Android內存泄露——全解析和處理辦法
Android開發(fā)中常見的5大內存泄漏問題及解決辦法

有不對的地方歡迎大家指出來!
謝謝G┕场!铅檩!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昧旨,一起剝皮案震驚了整個濱河市拾给,隨后出現的幾起案子兔沃,更是在濱河造成了極大的恐慌,老刑警劉巖乒疏,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異窍侧,居然都是意外死亡转绷,警方通過查閱死者的電腦和手機伟件,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門议经,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其骄,你說我怎么就攤上這事≌” “怎么了钧忽?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耸黑。 經常有香客問我,道長大刊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任葫辐,我火速辦了婚禮搜锰,結果婚禮上耿战,老公的妹妹穿的比我還像新娘。我一直安慰自己剂陡,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布歌馍。 她就那樣靜靜地躺著纤泵,像睡著了一般骆姐。 火紅的嫁衣襯著肌膚如雪捏题。 梳的紋絲不亂的頭發(fā)上肉渴,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音同规,去河邊找鬼。 笑死券勺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的关炼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼寸潦,長吁一口氣:“原來是場噩夢啊……” “哼社痛!你這毒婦竟也來了见转?” 一聲冷哼從身側響起蒜哀,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乘客,沒想到半個月后赊抖,有當地人在樹林里發(fā)現了一具尸體寨典,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年报亩,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦追。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡花竞,死狀恐怖,靈堂內的尸體忽然破棺而出约急,到底是詐尸還是另有隱情,我是刑警寧澤厌蔽,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站奴饮,受9級特大地震影響,放射性物質發(fā)生泄漏戴卜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一师脂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薇缅,春花似錦、人聲如沸泳桦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼坎。三九已至完疫,卻和暖如春泰鸡,著一層夾襖步出監(jiān)牢的瞬間壳鹤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工芳誓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锹淌。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像挟憔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绊谭,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容