性能優(yōu)化-內(nèi)存優(yōu)化

\color{red}{聲明:內(nèi)容禁止轉(zhuǎn)載旧巾,總結(jié)來自享學(xué)課堂知識(shí)的搬運(yùn),一切為了查找資料的方便芹橡;}

  • 一:App內(nèi)存組成以及限制
  • 二:什么是OOM打厘?
  • 三:Android 內(nèi)存分析命令介紹
  • 四,內(nèi)存三大問題
  • 五,MAT工具(查找具體內(nèi)存泄漏點(diǎn)的)
  • 六秫逝, LeakCanary
  • 七:Android內(nèi)存泄漏常見場景以及解決方案
  • 八:Bitmap (解決這個(gè)基本是99%的解決)
  • 九:總體思想

一:App內(nèi)存組成以及限制

Android給每個(gè)APP分配一個(gè)VM,讓App運(yùn)行在dalvik上恕出,這樣app奔潰了也不會(huì)影響系統(tǒng)。系統(tǒng)給VM 分配了一定的內(nèi)存大小违帆,如果應(yīng)用超過了vm最大內(nèi)存浙巫,就會(huì)出現(xiàn)
內(nèi)存溢出 crash;
由程序控制操作的內(nèi)存空間在heap上 分java heapsize 和 native heapsize
java申請的內(nèi)存在vm heap 上 所有如果java申請的內(nèi)存大小超過了vm邏輯內(nèi)存限制就會(huì)內(nèi)存溢出的異常;
native 層 內(nèi)存申請不受器限制 native層 native process 對內(nèi)存帶下的限制;

二:什么是OOM刷后?

1的畴,強(qiáng)引用,軟引用尝胆,弱引用,虛引用的區(qū)別;
軟引用內(nèi)存不足的時(shí)候才會(huì)回收丧裁,弱引用,gc掃描到了就會(huì)回收含衔;虛引用相當(dāng)于沒有引用;

三:Android 內(nèi)存分析命令介紹

常用的內(nèi)存調(diào)優(yōu)分析命令:

  1. dumpsys meminfo
  2. procrank
  3. cat /proc/meminfo
  4. free
  5. showmap
  6. vmstat

四,內(nèi)存三大問題

1煎娇,內(nèi)存抖動(dòng)

內(nèi)存波動(dòng)圖形呈鋸齒狀,GC導(dǎo)致卡頓; 比如贪染,自定view的時(shí)候缓呛,在ondraw等地方頻繁創(chuàng)建對象,系統(tǒng)無連續(xù)可用的內(nèi)存空間杭隙,就頻繁GC哟绊,導(dǎo)致卡頓;

2痰憎,內(nèi)存泄漏

在當(dāng)前應(yīng)用周期內(nèi)不再使用的對象被GC roots引用票髓,導(dǎo)致不能回收,使實(shí)際可用內(nèi)存變行攀狻炬称;

3,內(nèi)存溢出

即OOM涡拘,OOM時(shí)會(huì)導(dǎo)致程序異常玲躯,Android設(shè)備出廠以后,java虛擬機(jī)對單個(gè)應(yīng)用的最大內(nèi)存分配就確定下來了,超過這個(gè)值就會(huì)OOM;
OOM時(shí)不時(shí)一定代表內(nèi)存不夠了嗎跷车?
(1)Java堆內(nèi)存溢出棘利,
(2)無足夠連續(xù)內(nèi)存空間(整體加起來夠可是,無連續(xù)的),
(3)FD數(shù)量超過限制(fd文件句柄)
(4)線程數(shù)量超出限制(每個(gè)應(yīng)用的線程數(shù)是有限制的朽缴,小于1000個(gè)善玫,這種情況可以用線程池,業(yè)務(wù)有問題密强,都1000個(gè)線程了)茅郎,
(5)虛擬內(nèi)存不足

五,MAT工具(查找具體內(nèi)存泄漏點(diǎn)的)

六或渤, LeakCanary

https://github.com/square/leakcanary

1系冗, LeakCanary是如何安裝的?

  • 注冊app:contentprovider contentprovider.oncreate 比 application.oncreate 更先執(zhí)行
  • 2薪鹦,apk 打包流程 mergeAndroidManifest.xml -> app AndroidManifest

2掌敬, LeakCanary檢測Activity退出的原理

1,ActivityLifecycleCallbacks 生命周期回調(diào)去檢測
2,Reference弱引用 Reference弱Queue

七:Android內(nèi)存泄漏常見場景以及解決方案

1、資源性對象未關(guān)閉

對于資源性對象不再使用時(shí)池磁,應(yīng)該立即調(diào)用它的close()函數(shù)奔害,將其關(guān)閉,然后再置為null地熄。例如Bitmap等資源未關(guān)閉會(huì)造成內(nèi)存泄漏华临,此時(shí)我們應(yīng)該在Activity銷毀時(shí)及時(shí)關(guān)閉。

2离斩、注冊對象未注銷

例如BraodcastReceiver银舱、EventBus未注銷造成的內(nèi)存泄漏,我們應(yīng)該在Activity銷毀時(shí)及時(shí)注銷跛梗。

3、類的靜態(tài)變量持有大數(shù)據(jù)對象

盡量避免使用靜態(tài)變量存儲(chǔ)數(shù)據(jù)棋弥,特別是大數(shù)據(jù)對象核偿,建議使用數(shù)據(jù)庫存儲(chǔ)。

4顽染、單例造成的內(nèi)存泄漏

優(yōu)先使用Application的Context漾岳,如需使用Activity的Context,可以在傳入Context時(shí)使用弱引用進(jìn)行封裝粉寞,然后尼荆,在使用到的地方從弱引用中獲取Context,如果獲取不到唧垦,則直接return即可捅儒。

5、非靜態(tài)內(nèi)部類的靜態(tài)實(shí)例

該實(shí)例的生命周期和應(yīng)用一樣長,這就導(dǎo)致該靜態(tài)實(shí)例一直持有該Activity的引用巧还,Activity的內(nèi)存資源不能正潮廾В回收。此時(shí)麸祷,我們可以將該內(nèi)部類設(shè)為靜態(tài)內(nèi)部類或?qū)⒃搩?nèi)部類抽取出來封裝成一個(gè)單例澎怒,如果需要使用Context,盡量使用Application Context阶牍,如果需要使用Activity Context喷面,就記得用完后置空讓GC可以回收,否則還是會(huì)內(nèi)存泄漏走孽。

6惧辈、Handler臨時(shí)性內(nèi)存泄漏

在Queue中存在的時(shí)間過長,就會(huì)導(dǎo)致Handler無法被回收融求。如果Handler是非靜態(tài)的咬像,則會(huì)導(dǎo)致Activity或者Service不會(huì)被回收。并且消息隊(duì)列是在一個(gè)Looper線程中不斷地輪詢處理消息生宛,當(dāng)這個(gè)Activity退出時(shí)县昂,消息隊(duì)列中還有未處理的消息或者正在處理的消息,并且消息隊(duì)列中的Message持有Handler實(shí)例的引用陷舅,Handler又持有Activity的引用倒彰,所以導(dǎo)致該Activity的內(nèi)存資源無法及時(shí)回收,引發(fā)內(nèi)存泄漏莱睁。解決方案如下所示:

  • 1待讳、使用一個(gè)靜態(tài)Handler內(nèi)部類,然后對Handler持有的對象(一般是Activity)使用弱引用仰剿,這樣在回收時(shí)创淡,也可以回收Handler持有的對象。
  • 2南吮、在Activity的Destroy或者Stop時(shí)琳彩,應(yīng)該移除消息隊(duì)列中的消息,避免Looper線程的消息隊(duì)列中有待處理的消息需要處理部凑。

需要注意的是露乏,AsyncTask內(nèi)部也是Handler機(jī)制,同樣存在內(nèi)存泄漏風(fēng)險(xiǎn)涂邀,但其一般是臨時(shí)性的瘟仿。對于類似AsyncTask或是線程造成的內(nèi)存泄漏,我們也可以將AsyncTask和Runnable類獨(dú)立出來或者使用靜態(tài)內(nèi)部類比勉。

7劳较、容器中的對象沒清理造成的內(nèi)存泄漏

在退出程序之前驹止,將集合里的東西clear,然后置為null兴想,再退出程序

8幢哨、WebView

WebView都存在內(nèi)存泄漏的問題,在應(yīng)用中只要使用一次WebView嫂便,內(nèi)存就不會(huì)被釋放掉捞镰。我們可以為WebView開啟一個(gè)獨(dú)立的進(jìn)程,使用AIDL與應(yīng)用的主進(jìn)程進(jìn)行通信毙替,WebView所在的進(jìn)程可以根據(jù)業(yè)務(wù)的需要選擇合適的時(shí)機(jī)進(jìn)行銷毀岸售,達(dá)到正常釋放內(nèi)存的目的。

9厂画、使用ListView時(shí)造成的內(nèi)存泄漏

在構(gòu)造Adapter時(shí)凸丸,使用緩存的convertView。

八:Bitmap (解決這個(gè)基本是99%的解決)

http://www.reibang.com/p/59cb10228f6c

九:總體思想

1袱院,設(shè)備分級(jí)

2.Bitmap優(yōu)化

統(tǒng)一圖片庫

線上線下監(jiān)控 hook

glide:官方推薦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屎慢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忽洛,更是在濱河造成了極大的恐慌腻惠,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欲虚,死亡現(xiàn)場離奇詭異集灌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)复哆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門欣喧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梯找,你說我怎么就攤上這事唆阿。” “怎么了锈锤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵酷鸦,是天一觀的道長。 經(jīng)常有香客問我牙咏,道長,這世上最難降的妖魔是什么嘹裂? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任妄壶,我火速辦了婚禮,結(jié)果婚禮上寄狼,老公的妹妹穿的比我還像新娘丁寄。我一直安慰自己氨淌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布伊磺。 她就那樣靜靜地躺著盛正,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屑埋。 梳的紋絲不亂的頭發(fā)上豪筝,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音摘能,去河邊找鬼续崖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛团搞,可吹牛的內(nèi)容都是我干的严望。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼逻恐,長吁一口氣:“原來是場噩夢啊……” “哼像吻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起复隆,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拨匆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昏名,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮雷,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年轻局,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洪鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仑扑,死狀恐怖览爵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镇饮,我是刑警寧澤蜓竹,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站储藐,受9級(jí)特大地震影響俱济,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钙勃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一蛛碌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辖源,春花似錦蔚携、人聲如沸希太。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊辉。三九已至,卻和暖如春亡脑,著一層夾襖步出監(jiān)牢的瞬間堕澄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工远豺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奈偏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓躯护,卻偏偏與公主長得像惊来,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子棺滞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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