Grow heap (frag case) 堆內(nèi)存過大的深入解析
對于Android開發(fā)者來說雖然使用了可以自動管理內(nèi)存的Java語言,但是對于內(nèi)存管理不當(dāng),可能你的應(yīng)用不斷出現(xiàn)類似INFO/dalvikvm-heap(10798): Grow heap (frag case) to 6.437MB for 1114126-byte allocation,而出現(xiàn)的
Grow heap 后面的值不斷增加,接下來輕微則Android系統(tǒng)開始結(jié)束后臺任務(wù)來增加不斷增加的堆內(nèi)存問題,最后可能直接出現(xiàn)OOM,同時有時候GC還可能出現(xiàn)GC freed 0 objects / 0 bytes in 75ms這樣的問題,對于Java的內(nèi)存管理我們近期已經(jīng)說到了,就上面這些問題Android123給大家做一個簡單的分析。
1. 這里Grow heap (frag case) to 6.437MB for 1114126-byte allocation表示你一直在分配一個較大的對象,占用的堆內(nèi)存達(dá)到了6.4MB。
2. 為什么會出現(xiàn)這樣的問題,經(jīng)過詢問表示是因為分配了一個byte[]數(shù)組,需要以Blob方式寫入SQLite數(shù)據(jù)庫,而造成的這么大的單個對象出現(xiàn),這里Android開發(fā)網(wǎng)提醒大家,這是很危險的操作,對于不同固件和低RAM配置的設(shè)備隨時都有OOM的危險,如果你真的需要往SQLite存儲二進(jìn)制,這里可以采用分段的方式,將某個對象拆分為1MB或更小,分更多的段來存放,中間加一層拆分?jǐn)?shù)據(jù)緩存層來解決比較好。
3. 同時每次構(gòu)造單個較大對象前,可以通知gc準(zhǔn)備收集,比如在執(zhí)行需要耗操作前執(zhí)行System.gc(); 防止OutOfMemoryError的發(fā)生,對于Java的內(nèi)存溢出問題,今后我們會通過各種案例來講解。
相關(guān)文章
Android實現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法詳解
這篇文章主要介紹了Android實現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法,結(jié)合實例形式詳細(xì)分析了Activity、Service與Broadcaster三大組件相互調(diào)用的原理,實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下2016-03-03Android?RecyclerChart其它圖表繪制示例詳解
這篇文章主要為大家介紹了Android?RecyclerChart其它圖表繪制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android Service總結(jié)及詳細(xì)介紹
本文主要介紹Android Service的知識,這里整理了詳細(xì)資料及簡單實現(xiàn)示例代碼,有需要的小伙伴可以參考下2016-09-09Android自定義ActionProvider ToolBar實現(xiàn)Menu小紅點
這篇文章主要介紹了Android自定義ActionProvider ToolBar實現(xiàn)Menu小紅點,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Python基礎(chǔ)教程學(xué)習(xí)筆記 第二章 列表和元組
這篇文章主要介紹了Python基礎(chǔ)教程學(xué)習(xí)筆記 第二章 列表和元組,需要的朋友可以參考下2015-03-03