Android開發超常見的記憶體洩露以及解決

2021-07-03 22:07:34 字數 1153 閱讀 8448

什麼是記憶體洩露?gc無法**原本應該被**的物件,這個物件就引發了記憶體洩露

1.bitmap使用完忘記**,因為bitmap實現部分是通過jni呼叫了native方法,gc機制無法正常** bitmap申請的這部分記憶體空間(api10之前是這樣的,之後分配在heap中,不過為了相容老版本...顯示的呼叫一下recycled,也能讓gc更快的**調自己);

那bitmap應該怎樣**呢?

// bitmap!=null要放在前面,如果bitmap為空再去呼叫isrecycled方法便會報錯

if(bitmap!=

null

&&!bitmap.isrecycled)

接下來,講兩個更為常見的記憶體洩露,大家根據這兩個可以自行擴充套件

btn_hint.setonclicklistener(

newview.onclicklistener

});是不是很常見,平時可能也是這樣寫的(將其封裝意義一樣,只要引用了當前activity),你可能想問,這裡有什麼問題嗎?

問題在於如果使用者在toast消失之前,使用者按了返回鍵,這個activity就引起了記憶體洩露,

原因? toast持有了當前activity,導致activity無法被gc銷毀

private

static

context mcontext;

public

static

//供外界呼叫...

return

}@override

public

void

oncreate

另乙個常見的...記憶體洩露

newthread ;

}.start;

這裡也有問題?你tm逗我?

在activity中 新建乙個執行緒,進行網路請求,如果執行緒未結束,使用者按了返回鍵,同樣記憶體洩露

原因:該thread是匿名內部類,所以會隱式的持有外部類(這裡也就是activity)

解決方式:多種多樣; 不使用匿名內部類,或者整個應用維護乙個執行緒池,或者維護乙個執行緒佇列,後兩種都是讓執行緒不依賴於activity從而達到避免記憶體洩露的目的;

資源獲取等等很多地方都需要用到context,很多地方都會用到匿名內部類,這也就導致了這裡存在很大的記憶體洩露隱患,但平時很多小夥伴可能還沒有注意到,希望這篇文章能給你一些啟發。

Android記憶體洩漏常見情況

android記憶體中的洩漏主要是由堆記憶體造成的。2 靜態類強引用了某個activity導致activity無法被 3 非靜態內部類的使用,非靜態內部類和匿名內部類都會隱式的持有其外部類的引用。建議使用靜態內部類加弱應用的方式。4 對於使用了braodcastreceiver,contentobs...

Android開發 之 常見異常處理

1 pen failed eisdir is a directory 這個異常是因為我在sd卡中建立目錄資料夾的時候,應該一層一層的建立資料夾 例如 我要建立 mnt sdcard zhufu apkbus 這樣的路徑資料夾,其中 zhufu 和 apkbus 資料夾都是不存在的,我需要mkdir來...

常見的記憶體洩漏

vector v new vector 10 for int i 1 i 100 i 如果我們僅僅釋放引用本身,那麼 vector 仍然引用該物件,所以這個物件對 gc 來說是不可 的。因此,如果物件加入到vector 後,還必須從 vector 中刪除,最簡單的方法就是將 vector 物件設定為...