内存泄露

146 阅读1分钟

内存泄露介绍

定义:内存中存在已经没有用的对象

表现:内存抖动、可用内存逐渐变少

危害:内存不足、GC频繁、OOM

Memory Analyzer

www.eclipse.org/mat/downloa…

先保存heap文件

359457389.png 然后转换:hprof-conv 源文件路径 转换后文件路径

内存泄露解决实战

代码:

public interface CallBack {
    void dpOperate();
}
public class CallBackManager {
    public static ArrayList<CallBack> sCallBacks = new ArrayList<>();

    public static void addCallBack(CallBack callBack) {
        sCallBacks.add(callBack);
    }

    public static void removeCallBack(CallBack callBack) {
        sCallBacks.remove(callBack);
    }

}
public class MemoryLeakActivity extends AppCompatActivity implements CallBack{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_memoryleak);
        ImageView imageView = findViewById(R.id.iv_memoryleak);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.splash);
        imageView.setImageBitmap(bitmap);

        CallBackManager.addCallBack(this);
    }

    @Override
    public void dpOperate() {
        // do sth
    }
}

进入MemoryLeakActivity后回退,多操作几次,现象:

137094450.png 分析:

Memory Profiler查看:

137104348.png

MAT查看:

先从as中保存hprof文件 137122869.png 由于MAT不能识别从as中直接保存的hprof文件,需要转换:platform-tools/hprof-conv 源文件路径 转换后文件路径

搜索MemoryLeakActivity 137069574.png 列出MemoryLeakActivity实例,以及哪些对象引用了MemoryLeakActivity实例 137131335.png 查看MemoryLeakActivity对象到GC Roots的路径 137122899.png 查看最终泄露的原因 137094697.png