1. 程式人生 > 程式設計 >Android記憶體溢位及記憶體洩漏原因進行

Android記憶體溢位及記憶體洩漏原因進行

記憶體溢位(Out Of Memory):Android系統中每一個應用程式可以向系統申請一定的記憶體,當申請的記憶體不夠用的時候,就產生了記憶體溢位。

記憶體洩漏:當某個物件不再被使用,即不再有變數引用它時,該物件佔用的記憶體就會被系統回收。當某個物件不再被使用,但是在其他物件中仍然有變數引用它時,該物件佔用的記憶體就無法被系統回收,從而導致了記憶體洩漏。

當記憶體洩漏過多時,可用記憶體空間會減少,應用程式申請的記憶體不夠用,就會導致記憶體溢位。

記憶體溢位原因:

1.記憶體洩漏過多。

2.記憶體中載入的資料量超過記憶體的可用量。

3.集合類(用於儲存物件的引用)中有對物件的引用,使用完後未清空。

4.申請的記憶體不夠。

5.死迴圈或者迴圈產生過多物件例項,導致大量記憶體被消耗。

。。。

記憶體洩漏原因:

1.資源物件沒有關閉:

(1)註冊廣播接收器後沒有呼叫unregisterReceiver()方法登出廣播接收器。

(2)開啟檔案流之後沒有呼叫close()方法關閉檔案流。

(3)資料庫遊標cursor使用完後沒有呼叫close()方法關閉遊標。

(4)圖片資源Bitmap使用完之後沒有呼叫recycle()方法回收。

。。。

2.生命週期長的物件持有生命週期短的物件的引用,導致生命週期短的物件記憶體無法被回收:

(1)單例模式或者靜態成員變數的生命週期和應用程式的生命週期相等,當需要引用Context時,如果傳入的是Activity的Context,Activity需要被銷燬時就無法被回收。解決方法是傳入Application的Context,因為Application的Context生命週期等於應用程式的生命週期。

(2)非靜態內部類(匿名內部類、Handler等)預設持有外部類的引用,如果非靜態內部類的物件例項生命週期比外部類生命週期長(比如非靜態內部類定義了一個靜態的物件例項),外部類登出時就無法被系統回收,從而導致記憶體洩漏。解決方法是採用靜態內部類+弱引用的方式。

總結:記憶體洩漏產生的原因主要有兩種:一種是資源物件在使用完後沒有進行關閉操作。另一種是生命週期長的物件引用了生命週期短的物件,導致生命週期短的物件即使不再使用但仍然無法被系統回收。根本原因在於需要被回收的記憶體資源沒有被系統回收。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。