Android中記憶體洩漏的幾種情況

2021-08-10 17:29:58 字數 1579 閱讀 4720

1.單例造成的記憶體洩漏;

android中單例模式中的餓漢式寫法如下:

public class example 

private static example instance;

private example(context context)

public static example getinstance(context context)}}

return instance;

}或者我們平時最常用到的單例模式

public class example 

private static example instance;

private example(context context)

public static example getinstance(context context)

return instance;}

我們在activity中呼叫getinstance()並傳入this時,example中便持有activity的引用,當activity退出時,activity無法會**,就會造成記憶體洩漏.

正確的寫法是在example的構造方法中做出如下修改:

private example(context context)

public class example

mainactivity中建立了example的靜態物件,從而example持有了activity的引用,在activity銷毀時無法被**,從而造成記憶體洩漏,解決的方法是instance修改為非靜態物件,,或者把example修改為靜態內部累,從未避免造成記憶體洩漏.

3.handle和runnable作為非靜態內部類

我們在使用handler或new runnable時,通常使用匿名內部類的形式,即直接new出乙個物件進行一些延時操作,如果在延時等待過程中,activity被銷毀了,此時acitivity無法被銷毀並**,會造成記憶體洩漏.在寫**時,應該將handler或runnable定義為靜態內部類,然後在activity中new出這些類的物件,再進行延時操作.

然後最好在ondestory()中呼叫handler.removecallbacks(runnable)取消定時操作,這樣在acitivity銷毀後, 也不會觸發run()方法.

note:還有一種比較少見的情況,就是在handler或runnable的構造方法中需要context物件,在activity中呼叫handler或runnable類建立物件並傳入this時,handler或runnable也會持有acitivity的引用,同樣會造成記憶體洩漏.修改方法是使用若引用傳入context,**如下:

private class mainactivity extend fragmentactivity

}4.還有一些其他的違規操作會造成記憶體洩漏,如broadcastreceiver,inputstream,cource使用後未及時unregisterreceiver或關閉,都會造成記憶體洩漏.

造成記憶體洩漏的主要原因是長生命週期持有短生命週期的引用,短生命週期在週期結束時,長生命週期仍然存在,導致無法被**,從而造成記憶體洩漏.

看了郭神的文章,感覺這幾點比較重要,在壘**的時候需要特別注意,特別記錄下來.

android記憶體洩漏

參考 什麼是記憶體洩漏 記憶體洩露,簡單的說,就是該被釋放的記憶體沒有被釋放,一直被某個或某些例項所引用但不能被使用,導致gc不能 造成記憶體洩漏。總結的說,可以理解為長生命週期的物件一直持有短生命週期物件的引用,導致短生命週期物件一直被引用而無法被gc 記憶體洩漏是造成oom的主要原因之一,當乙個...

android 記憶體洩漏

1 android效能優化 記憶體洩漏 上 android效能優化 記憶體洩漏 下 1 錯誤的單例模式 public class singleton public static singleton getinstance context context return instance 即使activ...

C 中記憶體洩漏的幾種情況

1.在類的建構函式和析構函式中沒有匹配的呼叫new和delete函式 兩種情況下會出現這種記憶體洩露 一是在堆裡建立了物件占用了記憶體,但是沒有顯示地釋放物件占用的記憶體 二是在類的建構函式中動態的分配了記憶體,但是在析構函式中沒有釋放記憶體或者沒有正確的釋放記憶體 2.沒有正確地清除巢狀的物件指標...