記憶體洩漏的原因

諸葛佩奇發表於2018-07-10

1、資源物件沒關閉。

如Cursor、File等資源。他們會在finalize中關閉,但這樣效率太低。容易造成記憶體洩露。 SQLiteCursor,當資料量大的時候容易洩露

2、使用Adapter時,沒有使用系統快取的converView。

3、即時呼叫recycle()釋放不再使用的Bitmap。

適當降低Bitmap的取樣率,如:

BitmapFactory.Options options = newBitmapFactory.Options();    
options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即圖片為原來的四分之一    
Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
複製程式碼

4、使用application的context來替代activity相關的context。

儘量避免activity的context在自己的範圍外被使用,這樣會導致activity無法釋放。

5、註冊沒取消造成記憶體洩露

如:廣播

6、集合中的物件沒清理造成的記憶體洩露我們通常把一些物件的引用加入到了集合中,當我們不需要該物件時,並沒有把它的引用從集合中清理掉,這樣這個集合就會越來越大。如果這個集合是static的話,那情況就更嚴重了。

**7、Handler應該申明為靜態物件, 並在其內部類中儲存一個對外部類的弱引用。

相關文章