送一个内存泄漏给 2016 的记几

2,989 阅读1分钟

原文链接:送一个内存泄漏给2016的记几

背景

年底了,看公司项目的友盟的bug列表,发现java.lang.OutOfMemoryError的问题不少,也该是时候还了。

问题描述

在解决内存泄漏的过程中,遇到一个静态变量导致的内存泄漏,关键是这代码还是自己敲的,明明已经使用弱引用,为什么还是内存泄漏了。看代码:

public class RtHttp {

    public static RtHttp instance = new RtHttp();
    public Context context;

    public static void with(Context context){
        WeakReference<Context> wrContext = new WeakReference<Context>(context);
        instance.context = wrContext.get();
    }
}

RtHttp为封装客户端网络框架请求的入口,假设两个条件:

  1. 其中传入的Context对象只能是Activity,不能使用context.getApplicationContext()(因为此RtHttp还封装了显示网络加载对话框的代码)。
  2. 不能在Activity onDestroy()方法中调用RtHttp.instance.context = null;
    已经使用了弱引用,为什么还是内存泄漏呢?

记几想不通,还到谷歌搜索使用弱引用依然内存泄漏WeakReference useless,无果。

鄙视脸

如果你已经看出问题了,请直接到评论吐槽。
如果你没看出问题,请把引用的文章看一遍。

总结

一个内存泄漏的问题,反映了Java基础不牢固,在学习知识和解决问题上也不够深入。一直想写一篇2016的总结,希望以此内存泄漏的问题为界,实现在2017的一个技术提升。

引用

Android 内存泄漏总结
Java内存、Android 内存泄漏
Java gc(垃圾回收机制)小结,以及Android优化建议
JVM GC垃圾回收机制