簡述Android OOM

什么是OOM

? ? ? 移動端內(nèi)存有限鼠证,手機(jī)給每個應(yīng)用分配大小有限(Google 源生OS分配的內(nèi)存為16M或者24M箫津,但是不同廠家的ROM會修改)诵冒。當(dāng)你使用的內(nèi)存空間接近閥值仙辟,實例化新對象雄右,需要分配新的內(nèi)存空間是。就會報Out of Memory巷送。

產(chǎn)生OOM的主要情況

1.同時加載大量大內(nèi)存對象驶忌。主要體現(xiàn)在加載大量Bitmap(如幀動畫、RecyclerView),內(nèi)存一下沖破閥值付魔,產(chǎn)生OOM聊品。

2.內(nèi)存泄露。內(nèi)存泄漏(Memory Leak)是指程序中己動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放几苍,造成系統(tǒng)內(nèi)存的浪費翻屈,導(dǎo)致程序運行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。當(dāng)內(nèi)存泄露到一定的量妻坝,接近閥值的時候伸眶,再去new新對象時就會OOM。

OOM的監(jiān)測

查找內(nèi)存泄漏可以使用Android Studio 自帶的Android Profiler工具(Android Studio3.0之后不僅可以監(jiān)測內(nèi)存刽宪,還可以監(jiān)測CPU和network)厘贼,也可以使用Square產(chǎn)品的LeadCanary(帖一個使用說明地址http://www.reibang.com/p/7db231163168)。

ps:看過一個面試問題圣拄。OOM能不能try/catch ? try/catch可以避免這次報錯嘴秸,但是沒有真正處理內(nèi)存問題,還是可能再下一分配內(nèi)存的位置觸發(fā)售担。

OOM的解決方式

加載大量圖片

? 1. Bitmap壓縮赁遗。BitmapFactory,可以修改質(zhì)量族铆。比如把ARGB.8888改成RGB.565岩四,bitmap占用內(nèi)存會縮小一半(但是去掉了透明度,有些圖片沒法直接轉(zhuǎn)哥攘。Glide就默認(rèn)設(shè)置的是RGB.565)剖煌。Options.inSampleSize可以壓縮圖片比例。

? 2. 緩存逝淹。LruCache是常用的第三方框架的圖片緩存處理方式耕姊。LruCache使用一個LinkedHashMap簡單的實現(xiàn)內(nèi)存的緩存,沒有軟引用栅葡,都是強(qiáng)引用茉兰。如果添加的數(shù)據(jù)大于設(shè)置的最大值,就刪除最先緩存的數(shù)據(jù)來調(diào)整內(nèi)存欣簇。

? 3. 軟引用&弱引用规脸。當(dāng)一個對象只有軟引用的時候,如果內(nèi)存不足就會回收熊咽。當(dāng)一個對象只有弱引用的時候莫鸭,不管當(dāng)前內(nèi)存空間足夠與否,都會回收它的內(nèi)存横殴。不過被因,由于垃圾回收器是一個優(yōu)先級很低的線程, 因此不一定會很快發(fā)現(xiàn)那些只具有弱引用的對象。

? 4.替換.png圖片梨与。用較小的圖片替換.png堕花,比如jpg或者svg等。

內(nèi)存泄露

? ? 1.靜態(tài)變量導(dǎo)致內(nèi)存泄露蛋欣。如一個靜態(tài)變量持有當(dāng)前Activity對象(但是很少有人會這么干吧)航徙。

? ? 2.單例模式導(dǎo)致的內(nèi)存泄露如贷。單例模式的特點是它的生命周期與Application一致陷虎。所以單例模式實例化對象時,要用Application.context杠袱。

? ? 3.非靜態(tài)內(nèi)部類和匿名內(nèi)部類導(dǎo)致的內(nèi)存泄露尚猿。非靜態(tài)內(nèi)部類和匿名內(nèi)部類隱式持有外部類的引用。Handler經(jīng)常會不注意的時候?qū)懗赡涿麅?nèi)部類楣富,就造成內(nèi)存泄露凿掂。

? ? 4.資源未關(guān)閉導(dǎo)致的內(nèi)存泄露。資源性對象比如Cursor纹蝴,Stream庄萎、File文件等往往都用了一些緩沖,不使用的時候塘安,應(yīng)該及時關(guān)閉它們糠涛,否則會造成內(nèi)存泄漏。

? ? 5.屬性動畫導(dǎo)致的內(nèi)存泄露兼犯。屬性動畫中的無限循環(huán)動畫忍捡,如果沒有在onDestroy中停止,盡管界面上看不到動畫效果切黔,但是Activity還是被View持有砸脊,會導(dǎo)致內(nèi)存泄露。

? ? 6.集合容器導(dǎo)致內(nèi)存泄露纬霞。當(dāng)不需要對象時凌埂,并沒有把它的引用從集合中清理掉,也是一種內(nèi)存泄露诗芜。

一些相關(guān)的細(xì)節(jié)

? ? 1.StringBuffer瞳抓、StringBuilder和String一樣,也用來代表字符串绢陌。String類是不可變類挨下,任何對String的改變都會引發(fā)新的String對象的生成;StringBuffer脐湾、StringBuilder則是可變類臭笆,任何對它所指代的字符串的改變都不會產(chǎn)生新的對象。StringBuffer考慮了線程安全,StringBuilder沒有愁铺。但是單線程StringBuilder效率更高鹰霍。

? ? 2.內(nèi)存抖動是由于短時間內(nèi)有大量對象進(jìn)出新生代區(qū)導(dǎo)致的,它伴隨著頻繁的GC茵乱。如在view的OnDraw方法中實例化對象茂洒,或者在循環(huán)中實例化不必要的對象。內(nèi)存抖動可能會導(dǎo)致UI線程被頻繁阻塞瓶竭,畫面卡頓督勺。

總結(jié)

? ? OOM是同時加載大量大內(nèi)存圖片或者gc無法及時回收對象,達(dá)到內(nèi)存閥值之后的報錯斤贰。需要通過寫代碼時注意和后期監(jiān)測來避免智哀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荧恍,隨后出現(xiàn)的幾起案子瓷叫,更是在濱河造成了極大的恐慌,老刑警劉巖送巡,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摹菠,死亡現(xiàn)場離奇詭異,居然都是意外死亡骗爆,警方通過查閱死者的電腦和手機(jī)次氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮腾,“玉大人糟需,你說我怎么就攤上這事」瘸” “怎么了洲押?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圆凰。 經(jīng)常有香客問我杈帐,道長,這世上最難降的妖魔是什么专钉? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任挑童,我火速辦了婚禮,結(jié)果婚禮上跃须,老公的妹妹穿的比我還像新娘站叼。我一直安慰自己,他們只是感情好菇民,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布尽楔。 她就那樣靜靜地躺著投储,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阔馋。 梳的紋絲不亂的頭發(fā)上玛荞,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音呕寝,去河邊找鬼勋眯。 笑死,一個胖子當(dāng)著我的面吹牛下梢,可吹牛的內(nèi)容都是我干的客蹋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怔球,長吁一口氣:“原來是場噩夢啊……” “哼嚼酝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竟坛,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钧舌,沒想到半個月后担汤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡洼冻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年崭歧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撞牢。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡率碾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屋彪,到底是詐尸還是另有隱情所宰,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布畜挥,位于F島的核電站仔粥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蟹但。R本人自食惡果不足惜躯泰,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望华糖。 院中可真熱鬧麦向,春花似錦、人聲如沸客叉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秀撇,卻和暖如春超棺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呵燕。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工棠绘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人再扭。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓氧苍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泛范。 傳聞我的和親對象是個殘疾皇子让虐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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