Koom内存检测之Activity Leak

博客详细分析了一个由于静态字段导致的Activity内存泄漏问题。ToastUtils的静态字段持有CompatToast,而CompatToast又持有View和Context,导致GuideActivity无法被正常释放。解决方法是在Activity销毁时将CompatToast的toastView设为null,断开引用链,避免Context泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{
    "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也不应该存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值