记录一下出现的问题:
Android内存泄漏主要原因:
1.单例模式生命周期导致内存泄漏
2.静态变量--->存在jvm方法区,生命周期从类加载开始
3.非静态内部类--->默认持有外部类的引用
建议使用 静态内部类+弱引用的方式
因为gc遇到弱引用的activity会释放
4.使用thread或asynctask(默认隐式持有外部activity引用)
5.集合中的对象未清理
6.资源未关闭,比如动画未cancel()
7.WebView加载网页会长期占用内存
Android gc内存回收
GC会选择一些它了解还存活的对象作为内存遍历的根节点(GC Roots),比方说thread stack中的变量,JNI中的全局变量,zygote中的对象(class loader加载)等,然后开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉。如下图蓝色部分。
Java内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。下面分析一些可能导致内存泄漏的情景。
java四种引用
1.强引用:Object obj=new Object(); 若强引用还在,GC永不会回收
2.软引用:在内存溢出之前进行二次回收
3.弱引用:引用对象只生存到下一次垃圾回收之前
4.虚引用:在对象被收集器回收之前时收到系统通知。