筆者因爲在近期須要找工做,因此近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想獲得的機會纔可能有機會入你懷中。android
筆者會將準備面試的學習過程記錄下來,方便本身覆盤的同時也但願能給一道找工做的小夥伴們一些幫助。筆者準備的內容大綱以下面試
接下來開始本篇博客的正菜:學習
當前佔用的內存加上申請的內存資源超過了Dalvk虛擬機的最大內存限制就會拋出Out Of Memory異常。優化
有什麼方法能夠避免OOM?動畫
OOM在不少狀況下都是由於圖片加載問題,因此針對bitmap的優化能夠在某種程度上避免OOM的發生ui
還有沒有其餘的方法?
1.靜態變量持有外部類的引用。
靜態變量和應用的生命週期同樣,由於靜態變量持有外部類的引用,當外部類被銷燬時,就會致使外部類沒法被GC,引發內存泄漏。因此儘可能不要使用靜態變量。
2.單例模式引發的內存泄露
單例模式的對象的生命週期和應用程序同樣長,因此它持有的引用也不能被GC,因此會引發內存泄露。
因此在單例模式中,能夠把單例對象的引用指向整個應用,就能夠避免內存泄露。好比正確的單例模式寫法以下:
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager(Context context) {
//this.context = context; //會引發內存泄漏
this.context = context.getApplicationContext(); //指向應用
}
public static AppManager getInstance(Context context) {
if (instance != null) {
instance = new AppManager(context);
}
return instance;
}
複製代碼
3.AsyncTask引發的內存泄露
AsyncTask是持有外部類的引用的,當它後臺任務沒有完成時,它會致使外部類的引用沒法被回收,引發內存泄漏。
因此能夠經過讓AsyncTask變成靜態內部類,這樣就不會持有外部類的引用了。 或者讓它持有外部類的弱引用。
4.使用完的資源未關閉
好比說在Bitmap在使用完後必定要關閉資源(調用它的recycle方法)
5.註冊沒取消形成的內存泄漏
好比調用registerReceiver後未調用unregisterReceiver。
動態註冊
優勢: 在android的廣播機制中,動態註冊優先級高於靜態註冊優先級,所以在必要狀況下,是須要動態註冊廣播接收者的。
缺點: 當用來註冊的 Activity 關掉後,廣播也就失效了。
靜態註冊
優勢: 無需擔心廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器就是打開着的。