內存泄漏和內存溢出

內存泄漏和內存溢出的定義

內存泄漏(Memory Leak)的含義

當一個對象不在使用了,本應該被垃圾回收器(JVM)回收。但是這個對象由於被其他正在使用的對象所持有,造成無法被回收的結果。內存泄漏最終會導致內存溢出。

內存溢出(Out of Memory)的含義

系統會給每個APP分配內存也就是Heap Size值。當APP佔用的內存加上我們申請的內存資源超過了Dalvik虛擬機的最大內存時就會拋出的Out Of Memory異常。

兩者區別

嚴格意義上來說,內存的持續泄漏會帶來內存溢出,但是內存泄漏不一定會觸發內存溢出;
同理,內存溢出不一定就是內存泄漏導致的,因爲android系統分配給每一個app的內存空間有限。

發生的原因和解決方法

一、圖片、音頻、視頻的加載資源過重
原因:
大量的圖片、音頻、視頻處理,當在內存比較低的系統上也容易造成內存溢出
解決方法:
使用第三方封裝的類庫或者JNI來進行處理

二、Bitmap對象的處理
原因:
主線程做了耗時操作;使用Bitmap對象後沒有釋放回收;圖片加載過大或者加載過度頻繁
解決方法:
不要在主線程中處理圖片;
使用Bitmap對象要用recycle釋放;
控制圖片的大小,壓縮大圖,如recyclerview滑動時不要加載圖片,滑動結束時再做加載處理

三、資源回收和註銷
原因:
BraodcastReceiver,ContentObserver,Cursor,File,Stream,ContentProvider,Bitmap,動畫,I/O,數據庫,網絡的連接等資源的使用,沒有在Activity銷燬時及時關閉或者註銷
解決方法:
回收掉或者銷燬掉沒有使用的資源
1、廣播BraodcastReceiver:記得註銷註冊unregisterReceiver();
2、文件流File:記得關閉流InputStream / OutputStream.close();
3、數據庫遊標Cursor:使用後關閉遊標cursor.close();
4、圖片資源Bitmap:當它不再被使用時,應調用recycle()回收此對象的像素所佔用的內存,再賦爲null;
5、動畫:屬性動畫或循環動畫,在Activity退出時需要停止動畫;
6、集合對象及時清理,使得JVM回收:我們通常會把對象存入集合中,當不使用時,清空集合,讓相關對象不再被引用;
7、三方庫如EventBus,RxJava等在Activity銷燬之前沒有解除訂閱:在Activity中的onDestroy()方法中解除訂閱 EventBus.getDefault().unregister(this);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章