1.内存泄漏的概念:
通俗点讲:
生命周期长的对象持有生命周期短的对象的引用,导致GC无法回收短生命周期对象。
系统来说:
jvm通过可达性算法,没有用的对象资源与GC-Root保持可达路径,导致系统无法进行回收
2.可以作为GC-Root的对象:
1.局部变量所引用的对象
2.方法参数所引用的对象
从虚拟机角度来看:
1.java虚拟机栈所引用的对象
2.方法区中的类静态属性引用的对象。 (一般指被static修饰的对象,加载类的时候就加载到内存中。)
比如单例模式
3.方法区中的常量引用的对象。
4.本地方法栈中的JNI(native方法)引用的对象
1.常见类型的内存泄漏
1.非静态内部类持有外部类的引用,如非静态handler持有activity的引用
2.接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus
3.Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
4.单例中的static成员间接或直接持有了activity的引用
5.资源对象没关闭造成的内存泄漏(如: Cursor、File等)
6.全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合)
2.Android Api使用导致的内存泄漏
Timer ,TimerTask,Handler等
Thread是如何造成内存泄露的,如何解决?
垃圾回收器不会回收GC Roots以及那些被它们间接引用的对象
非静态内部类会持有外部类的引用。Thread 会长久地持有 Activity 的引用,使得系统无法回收 Activity 和它所关联
的资源和视图。
使用静态内部类,不要使用非静态内部类
该养成为thread设置退出逻辑条件的习惯