Andoid內存泄露

1 android 內存泄露是由於分配的內存回收失敗 android

public static LocalHelper getInstance(Context context) {
if (instance==null){
instance = new LocalHelper(context);
}
return instance;
}

若是在contenx 傳一個Activity 那麼在Acitivty finish以後是沒法對activity 進行回收的
由於 靜態實例會對activity繼續引用, 這時候 內存沒法GC 會產生oom 和 內存泄露

2 Handler 引發的內存泄露

Handler 的使用形成的內存泄漏問題應該說是最爲常見了微信

,咱們知道 Handler、Message 和 MessageQueue 都是相互關聯在一塊兒的ui

 Handler 發送的 Message 還沒有被處理,則該 Message 及發送它的 Handler 對象將被線程 MessageQueue 一直持有。spa

因爲 Handler 屬於 TLS(Thread Local Storage) 變量, 生命週期和 Activity 是不一致的。.net

所以這種實現方式通常很難保證跟 View 或者 Activity 的生命週期保持一致,故很容易致使沒法正確釋放。線程

 建議使用弱引用 不過會有activity.成員變量 寫起來麻煩!對象

3  在imageloader 加載圖片的時候 若是 你使用了Rgb_565這樣是能夠在加載圖片的時候減小內存消耗 不過加載出來的圖片會模糊 建議使用 imagesize,blog

options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(false)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
ImageSize size = new ImageSize(getImageWidth(), getImageWidth());
imageLoader.loadImage(localFile.getOriginalUri(), size, options, new SimpleImageLoadingListener(viewHolder.imageView));
在imageload 加載原圖的時候 若果你圖片過大 建議使用線程數爲1 由於在3個線程同時加載的時候很容易 oom;

4 靜態集合類對象記得clear();

5 InputMethodManager 引發的內存泄露
首先你能夠先一下這個
http://blog.csdn.net/sodino/article/details/32188809 
寫得很詳細 他是經過反射獲取 content 而後 讓context = null 來去處引用

可是這樣作會須要在每一次finish 以後都會去call 這個方法
6 我發現5的這位大神的代碼是不能處理inputmethodmanager 內存溢出
仍是要在Application的時候去初始化
public  void initInputManager(){
try {
Class cls = Class.forName("android.view.inputmethod.InputMethodManager");
Method m = cls.getDeclaredMethod("getInstance", Context.class);
m.setAccessible(true);
m.invoke(null, getApplicationContext());
} catch (Throwable e) {
e.printStackTrace();
}
}
7 剪切板溢出也是同樣的道理,有時候在dialog也會溢出,dialog溢出是由於你先finish(),在dismiss()

8 ument 內存泄露處理
在分享的時候會
UMWXHandler wxHandler = new UMWXHandler(activity, wxAppId, wxAppSecret);
wxHandler.addToSocialSDK();
// 添加微信朋友圈
UMWXHandler wxCircleHandler = new UMWXHandler(activity, wxAppId, wxAppSecret);
wxCircleHandler.setToCircle(true);

可是若果你傳Activity 的話 會引發內存泄露
可使用弱引用
Activity activity=activity_.get();
if (activity==null){
return;
}
把參數 WeakReference<Activity> activity_ 傳過來
相關文章
相關標籤/搜索