Koom内存检测之Activity Leak

{
    
    
    "gcRoot": "Global variable in native code",
    "instanceCount": 1,
    "leakReason": "Activity Leak",
    "path": [
        {
    
    
            "declaredClass": "java.lang.ClassLoader",
            "reference": "dalvik.system.PathClassLoader.runtimeInternalObjects",
            "referenceType": "INSTANCE_FIELD"
        },
        {
    
    
            "declaredClass": "java.lang.Object[]",
            "reference": "java.lang.Object[]",
            "referenceType": "ARRAY_ENTRY"
        },
        {
    
    
            "declaredClass": "com.android.sohu.sdk.common.toolbox.ToastUtils",
            "reference": "com.android.sohu.sdk.common.toolbox.ToastUtils.mCheckNotification",
            "referenceType": "STATIC_FIELD"
        },
        {
    
    
            "declaredClass": "androidx.toast.CompatToast",
            "reference": "androidx.toast.CompatToast.toastView",
            "referenceType": "INSTANCE_FIELD"
        },
        {
    
    
            "declaredClass": "android.view.View",
            "reference": "android.widget.LinearLayout.mContext",
            "referenceType": "INSTANCE_FIELD"
        },
        {
    
    
            "reference": "com.sohu.sohuvideo.ui.GuideActivity",
            "referenceType": "instance"
        }
    ],
    "signature": "58be8ff8a88de8ab9f756ab4b261466deb6f87"
}

ClassLoader的实例字段Object数组中,有个元素存的是ToastUtils的类对象,ToastUtils的静态字段引用了CompatTost实例,CompatToast引用了View,View中引用了Context。
这一系列的引用,导致GuideActivity一直被引用着,释放不掉。

这是一个典型的static导致Context泄漏的问题

解决泄漏的最简单办法,就是在合适时机把引用链断开,具体在哪里断怎么断就需要根据业务分析了。

在这里,我选择了,activity销毁的时候,把CompatToast和View直接的引用断开,就是把toastView设置为null。这样做也是合理的,Activity不存在,View也不应该存在。

おすすめ

転載: blog.csdn.net/lizhongyisailang/article/details/124818011