Android常見異常與性能優(yōu)化

1. ANR異常(Application Not Responsing:應用程序無響應的彈框)

(1) 原因:在主線程進行了耗時操作(如:網(wǎng)絡IO操作、數(shù)據(jù)庫操作或耗時計算等)

拓展:運行在主線程的操作如下每窖,盡量避免在它們里面進行耗時操作睡陪。

  • Activity:Activity的所有生命周期回調運行在主線程(當然可在Activity生命周期回調中開啟子線程執(zhí)行耗時操作)
  • service:service運行在主線程(當然可在Service中開啟子線程執(zhí)行耗時操作盖矫,如封裝好的IntentService內有一個工作線程用來處理耗時操作)
  • Broadcast:BroadcastReceiver的onReceive()回調運行在主線程
  • Handler:主線程中l(wèi)ooper的Handler對象的handMessage()和post(runnable)方法運行在主線程
  • AsyncTask:AsyncTask回調中除了doInBackground()方法种柑,其他回調(UI更新相關)都運行在主線程

(2) 解決ANR:主線程中避免耗時操作,讓子線程執(zhí)行耗時任務定欧∮婧牵可參考異步消息處理機制

  • Thread:創(chuàng)建子線程執(zhí)行耗時操作
  • AsyncTask:抽象類AsyncTask派生出子類的doInBackground()方法來中執(zhí)行耗時操作
  • HandlerThread:HandlerThread線程中創(chuàng)建Handler對象,在handleMessage()方法中執(zhí)行耗時操作
  • IntentService:重寫IntentService的onHandleIntent()方法執(zhí)行耗時任務

2. OOM異常(Out Of Memory)

2.1 概念區(qū)分

  • 內存抖動:短時間內大量對象被創(chuàng)建又馬上被GC釋放砍鸠,即頻繁GC(垃圾回收)扩氢。瞬間產生的對象會嚴重占用內存區(qū)域,內存區(qū)域達到閥值時會觸發(fā)GC回收掉不用的對象爷辱,導致剛剛產生的對象又被回收录豺。
  • 內存泄漏:進程中的某些對象已經沒有被其他地方引用,但是他們卻可以直接或間接地引用其他沒被回收的對象饭弓,導致GC無法產生作用巩检。
  • 內存溢出(OOM):android系統(tǒng)會給每個安卓程序分配一定的內存,當程序所使用的內存超過最大值就會造成內存溢出示启,就是常說的OOM。

有些內存沒有被釋放從而失去控制领舰,造成程序可使用的內存越來越少夫嗓,系統(tǒng)運行速度減慢迟螺,嚴重情況下會導致程序崩潰,所以內存溢出是最嚴重的內存問題舍咖,必須解決矩父。

備注:內存抖動或內存泄漏累積到一定程度都會造成內存溢出。

2.2 OOM原因

原因:當前占用的內存 + 我們申請的內存資源 > Dalvik虛擬機被分配的最大內存排霉,常見于Bitmap大圖加載時出現(xiàn)OOM窍株。
備注:android系統(tǒng)會為每個應用程序分配一個獨立的工作空間(即Dalvik虛擬機空間),使各個app運行互不影響攻柠;android系統(tǒng)為每一個Dalvik虛擬機設定了最大內存限制球订。

2.3 解決OOM

(1) Bitmap造成的OOM解決(Bitmap優(yōu)化

  • 大圖壓縮:根據(jù)壓縮比(計算inBitmap屬性值)獲取縮略圖
  • 圖片顯示:加載4類圖片資源
  • 及時釋放Bitmap內存:通過recycle()回調方法回收資源
  • 捕獲異常(Error屬性可以捕獲到OOM,Exception屬性捕獲不到)

(2) 其他OOM解決

  • ListView(convertView復用 + 圖片三級緩存機制LRU)
  • 避免在onDraw()方法里執(zhí)行對象的創(chuàng)建(頻繁GC瑰钮,造成內存抖動冒滩,積累到一定程度導致內存溢出)
  • 謹慎使用多進程(使用復雜,同時使用不當會造成更多的內存溢出和程序錯誤浪谴,盡量不要使用)

3. Bitmap位圖

4. UI卡頓

(1) UI卡頓原理
android系統(tǒng)每隔16ms就會觸發(fā)一次頁面渲染开睡,若渲染成功(16內能完成相關計算),就更夠達到每秒60幀(60fps)的流暢效果苟耻;若渲染不成功(16內不能完成相關計算:耗時操作篇恒、布局復雜、動畫等原因)凶杖,就會丟幀造成UI卡頓胁艰。
1秒渲染次數(shù) = 1s/16ms =1000ms/16ms = 62.5次頁面渲染。
(2) UI卡頓常見原因

UI卡頓原因 分析 優(yōu)化 備注
UI線程做了輕微的耗時操作 嚴重將導致ANR 開啟子線程做耗時操作 異步消息處理框架
布局layout過于復雜 無法在16ms內完成渲染 布局優(yōu)化 -
布局層疊 導致View過渡繪制(某些像素在同一幀時間內被繪制多次) 布局優(yōu)化 View頻繁地觸發(fā)measure(測量)和layout(擺放)方法官卡,導致耗時過多及整個View頻繁地重新渲染蝗茁,從而使CPU或GPU負載過重
同一時間動畫執(zhí)行次數(shù)過多 導致CPU或GPU負載過重 合理地使用動畫 動畫雖效果好,但是更易造成性能要求
內存頻繁觸發(fā)GC(垃圾回收) 導致暫時阻塞渲染操作 - -
代碼質量 冗余資源及邏輯等導致加載和執(zhí)行緩慢 代碼優(yōu)化 -

5. 內存泄漏

6. 內存管理

(1) 內存管理 = 內存分配 + 內存回收
(2) android 進程優(yōu)先級:前臺進程 > 可見進程 > 服務進程 > 后臺進程 > 空
備注:系統(tǒng)會先回收優(yōu)先級低的進程寻咒。

7. 冷啟動優(yōu)化

8. 其他優(yōu)化

(1) 盡量不要用靜態(tài)變量存儲核心數(shù)據(jù)
(2) 有關sharePreference的安全問題

  • 不能跨進程讀寫
  • 不能存儲大數(shù)據(jù):sharePreference以key\value的形式存儲存儲數(shù)據(jù)哮翘,存儲過大數(shù)據(jù)易阻塞主線程,造成UI卡頓

(3) 內存對象序列化
(4) 避免在UI線程做繁重操作

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末毛秘,一起剝皮案震驚了整個濱河市饭寺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叫挟,老刑警劉巖艰匙,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抹恳,居然都是意外死亡员凝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門奋献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來健霹,“玉大人旺上,你說我怎么就攤上這事√锹瘢” “怎么了宣吱?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞳别。 經常有香客問我征候,道長,這世上最難降的妖魔是什么祟敛? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任疤坝,我火速辦了婚禮,結果婚禮上垒棋,老公的妹妹穿的比我還像新娘卒煞。我一直安慰自己,他們只是感情好叼架,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布畔裕。 她就那樣靜靜地躺著,像睡著了一般乖订。 火紅的嫁衣襯著肌膚如雪扮饶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天乍构,我揣著相機與錄音甜无,去河邊找鬼。 笑死哥遮,一個胖子當著我的面吹牛岂丘,可吹牛的內容都是我干的。 我是一名探鬼主播眠饮,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奥帘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仪召?” 一聲冷哼從身側響起寨蹋,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扔茅,沒想到半個月后已旧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡召娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年运褪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吐句,死狀恐怖胁后,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嗦枢,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布屯断,位于F島的核電站文虏,受9級特大地震影響,放射性物質發(fā)生泄漏殖演。R本人自食惡果不足惜氧秘,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趴久。 院中可真熱鬧丸相,春花似錦、人聲如沸彼棍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽座硕。三九已至弛作,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間华匾,已是汗流浹背映琳。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜘拉,地道東北人萨西。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像旭旭,于是被迫代替她去往敵國和親谎脯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容