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