Leakcanary部分洩露警報無需修復

2021-07-15 10:46:51 字數 2375 閱讀 3090

使用leakcanary檢查記憶體洩露之後,由於他的工作原理,造成所有的在上下文關閉之後,還未被釋放的資源就會引爆記憶體洩露通知。但是不是所有的洩露都需要修復的。下面總結幾個我的血淚史,希望以後不要重蹈覆轍。

#inputmethodmanager.sinstance洩露

輸入法洩露,具體的洩露路徑類似於

提示inputmethodmanager.sinstance這個靜態例項可能通過各種路徑對context進行了洩露。具體的路徑可能會不一樣,但是歸根到最後都是提示inputmethodmanager.sinstance靜態引用洩露。 通過網上搜尋,可能有類似的修復,如下 public static final class typedobject

object getobject

() class gettype()}

public

static

void

invokemethodexceptionsafe

(final object methodowner, final string method, final typedobject... arguments)

try}

final method declaredmethod = methodowner.getclass().getdeclaredmethod(method, types);

declaredmethod.setaccessible(true);

declaredmethod.invoke(methodowner, objects);

}catch (final throwable ignored)

}public

static

void

fixinputmethodmanager

(activity activity)

主要通過反射,修復記憶體洩露。

但是,下面的話,非常重要,非常重要,非常重要,重要的事情說三遍:這個屬於系統級別的洩露,也就是說,你不洩露,別人也會洩露,而且整個android系統,只保留乙個static instance的引用,所以這個修復,對整個系統的記憶體沒有太大的改善。而且這個修復的隱患是,你有可能會在頁面跳轉的時候,遇到各種不可**的編輯框無法獲取焦點的問題。所以,我建議,這個洩露,可以忽略。

有時候我們會遇到handlerthread沒有quit而爆出的洩露,洩露路徑如下:

而android系統中有個asyncqueryworker從源**看

public

asyncqueryhandler

(contentresolver cr)

}mworkerthreadhandler = createhandler(slooper);

}

這個名為asyncqueryworker的handlerthread自從start之後就沒人管了。這個時候,leakcanary也會提示洩露。 於是我曾自作聰明,通過反射將這個slooper強制退出,**如下:

release static slooper in asyncqueryhandler

public

static

void

fixasyncqueryworker

() catch (exception ex)

if (sloopercached == null) return;

looper looper = null;

try

} catch (exception ex)

這個修復的慘痛後果是,有些後台執行緒直接結束了,所以,對於asyncqueryhandler的洩露,我也是建議不修復。

和inputmanager一樣,這個洩露,屬於系統的靜態引用而造成的洩露,但是這個洩露的修復,目前沒有發現什麼不良的影響,但是洩露修復的價值意義不知道大不大,也是你不洩露,別人也會洩露,反正總有乙個這樣的引用存在的。修復的效果也不是很明顯 修復**如下

public

static

void

cleartextlinecache

() catch (exception ex)

if (textlinecached == null) return;

object cached = null;

try catch (exception ex)

if (cached != null) }}

leakcanary是乙個很好檢查記憶體洩露的工具,但不是所有的洩露都需要修復,有些事android系統的洩露bug,通過各種方式曲線救國之後,不一定會達到乙個很好的記憶體改善結果,所以乾脆不要去動他,以免引起不可**的執行異常。只有自己非常肯定的,由於使用不規範等引起的記憶體洩露才是我們重點關注的部

Leakcanary部分洩露警報無需修復

使用leakcanary檢查記憶體洩露之後,由於他的工作原理,造成所有的在上下文關閉之後,還未被釋放的資源就會引爆記憶體洩露通知。但是不是所有的洩露都需要修復的。下面總結幾個我的血淚史,希望以後不要重蹈覆轍。inputmethodmanager.sinstance洩露 輸入法洩露,具體的洩露路徑類似...

LeakCanary 檢測記憶體洩露

做個筆記,leakcanary 用起來方便簡單只需要兩步就可以 debug 測試 debugcompile com.squareup.leakcanary leakcanary android 1.5 testcompile com.squareup.leakcanary leakcanary an...

記憶體測試 記憶體洩露工具 LeakCanary

專案位址 接入方法 1.配置依賴 dependencies debugcompile com.squareup.leakcanary leakcanary android 1.4 beta2 releasecompile com.squareup.leakcanary leakcanary andr...