内存泄漏
java是垃圾回收语言,无需开发者管理内存分配
逻辑上的失误导致内存泄漏:当应用不再需要这个对象的时候仍未释放该对象的所有应用
1.Context,由于Content包含了大量的内存引用。
全局的process的static引用activity
2.static view
2.静态inner classes
内部类持有外部类的强引用
3.匿名类
当acitivity被销毁的时候,匿名的AsyncTask会持有activity的强引用直到asynctask结束
避免在Activity中使用非静态内部类,如果该类的实例会存在在Activity的生命周期之外
4.Handler
与匿名类类似,当message没处理完时,handler不会被释放
5.Threads
thread没运行结束时,也会持有activity
6.TimerTask
只要是匿名类的实例,不管是不是在工作线程,都会持有Activity的引用,导致内存泄漏。
静态内部类代替匿名类,使用弱引用访问外部类
7.Sensor Manager listener
没有注销监听器,也会导致内存泄漏
GC
没有GCRoot的对象将被回收
1.强引用
- 当其指示的对象没有任何强引用对象指向它;
2.软引用
- 当其指示的对象没有任何强引用对象指向它;
- 当虚拟机内存不足时。
3.弱引用
WeakReference不改变原有强引用对象的垃圾回收时机,一旦其指示对象没有任何强引用对象时,此对象即进入正常的垃圾回收流程。
- 虚引用
方法
LeakCanary