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

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

背景

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

问题描述

在解决内存泄漏的过程当中,遇到一个静态变量致使的内存泄漏,关键是这代码仍是本身敲的,明明已经使用弱引用,为何仍是内存泄漏了。看代码:github

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的一个技术提高。less

引用

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

相关文章
相关标签/搜索