java中非静态内部类造成内存泄漏,替换成静态为什么就不会内存泄漏(面试中遇到)
首先我们知道非静态内部类会持有外部内部类的隐式引用参看
非静态内部类中线程生命周期不可控,能否正常回收完全由线程的生命周期决定。如果线程是永久运行的,那么将永远无法释放,因为在Java中线程是垃圾回收机制的根源,在运行系统中DVM虚拟机总会硬件持有所有运行状态的进程的引用,结果导致处于运行状态的线程将永远不会被回收,导致内存泄漏。
当替换成静态内部类时,就不再持有外部类的隐式引用,当然就不会导致内存泄漏,如果需要引用外部类的实例,可以显式持有一个弱引用对象或软引用对象,弱引用GC时会被GC掉,软引用对象内存不足时会被GC掉
记录一下:主要参看这两篇博客
Android 非静态内部类导致内存泄漏原因深入剖析
Handler的正确使用,使用静态内部类+弱引用,解决内存泄漏,举例说明在使用ProgressBar时的Handler类的静态内部类实现