多執行緒記憶體洩漏 記憶體洩漏的場景和解決辦法

2021-10-14 17:46:04 字數 1006 閱讀 8892

1.非靜態內部類會持有外部類的引用,如果非靜態內部類的例項是靜態的,就會長期的維持著外部類的引用,組織被系統**,解決辦法是使用靜態內部類

2.多執行緒相關的匿名內部類和非靜態內部類

3.handler記憶體洩漏

handler導致的記憶體洩漏也可以被歸納為非靜態內部類導致的,handler內部message是被儲存在messagequeue中的,有些message不能馬上被處理,存在的時間會很長,導致handler無法被**,如果handler是非靜態的,就會導致它的外部類無法被**,解決辦法是1.使用靜態handler,外部類引用使用弱引用處理2.在退出頁面時移除訊息佇列中的訊息

4.context導致記憶體洩漏

5.靜態view導致洩漏

使用靜態view可以避免每次啟動activity都去讀取並渲染view,但是靜態view會持有activity的引用,導致無法**,解決辦法是在activity銷毀的時候將靜態view設定為null(view一旦被載入到介面中將會持有乙個context物件的引用,在這個例子中,這個context物件是我們的activity,宣告乙個靜態變數引用這個view,也就引用了activity)

6.webview導致的記憶體洩漏

webview只要使用一次,記憶體就不會被釋放,所以webview都存在記憶體洩漏的問題,通常的解決辦法是為webview單開乙個程序,使用aidl進行通訊,根據業務需求在合適的時機釋放掉

7.資源物件未關閉導致

如cursor,file等,內部往往都使用了緩衝,會造成記憶體洩漏,一定要確保關閉它並將引用置為null

8.集合中的物件未清理

集合用於儲存物件,如果集合越來越大,不進行合理的清理,尤其是入股集合是靜態的

9.bitmap導致記憶體洩漏

bitmap是比較佔記憶體的,所以一定要在不使用的時候及時進行清理,避免靜態變數持有大的bitmap物件

10.***未關閉

很多需要register和unregister的系統服務要在合適的時候進行unregister,手動新增的listener也需要及時移除

Golang 記憶體洩漏場景

雖然golang 的runtime 會 記憶體,但是本文列舉的場景仍然會造成記憶體洩漏。todo 此處需要了解下golang 的底層 memory block 分配知識 var s0 string 包級別變數 a demo purpose function.func f s1 string func...

記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位

記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...

安卓記憶體洩漏(三) 洩漏場景

模糊感覺,感覺什麼handler。context記憶體洩漏 一開始各種handler,後來感覺都不敢用,感覺都是記憶體洩漏 梳理1 handler內部類導致記憶體洩漏 handler裡面控制訊息,訊息在佇列裡面,如果設定10s才去處理。則訊息一直在佇列裡面。那這個10s時間handler無法銷毀。內...