經典指數          
原因
562
瀏覽數
0
收藏數
 

App運行時發生OOM的原因你知道哪幾種?如何避免?

     舉報   糾錯  
該題目由題來君提供于 2017-12-25 00:03
 
切換
1 個答案
1.資源對象沒關閉造成的內存泄露,try catch finally中將資源回收放到finally語句可以有效避免OOM。資源性對象比如: 1-1,Cursor 1-2,調用registerReceiver后未調用unregisterReceiver() 1-3,未關閉InputStream/OutputStream 1-4,Bitmap使用后未調用recycle() ? 2.作用域不一樣,導致對象不能被垃圾回收器回收,比如: 2-1,非靜態內部類會隱式地持有外部類的引用, 2-2,Context泄露 概括一下,避免Context相關的內存泄露,記住以下事情: ?? 1、 不要保留對Context-Activity長時間的引用(對Activity的引用的時候,必須確保擁有和Activity一樣的生命周期) ?? 2、嘗試使用Context-Application來替代Context-Activity 3、如果你不想控制內部類的生命周期,應避免在Activity中使用非靜態的內部類,而應該使用靜態的內部類,并在其中創建一個對Activity的弱引用。 ????? 這種情況的解決辦法是使用一個靜態的內部類,其中擁有對外部類的WeakReference。 2-3,Thread 引用其他對象也容易出現對象泄露。 2-4,onReceive方法里執行了太多的操作 3.內存壓力過大 ? 3-1,圖片資源加載過多,超過內存使用空間,例如Bitmap 的使用 ? 3-2,重復創建view,listview應該使用convertview和viewholder ? 如何避免內存泄露: 1.使用緩存技術,比如LruCache、DiskLruCache、對象重復并且頻繁調用可以考慮對象池 2.對于引用生命周期不一樣的對象,可以用軟引用或弱引用SoftReferner WeakReferner 3.對于資源對象 使用finally 強制關閉 4.內存壓力過大就要統一的管理內存
舉報   題來君 · 2018-01-01 23:05
 
切換
撰寫答案
掃描后移動端查看本題
广西快三结果控