Java中内部类使用方便,但是在使用过程中,也会存在比较隐蔽的风险,以下介绍下Java内部类中可能存在的内存泄露问题。
这是一个简单的Activity,里面有两个简单的方法,test()和test2(),test()和test2()的唯一区别就是一个是静态的,一个非静态的。
同时这个类有个成员变量bigData,主要是分配10M的内存,便于查看内存的变化。
测试方法:
只调用test方法:当Activity销毁后,发现只有等线程结束后,该Activity才能被回收;
只调用test2方法:当Activity销毁后,发现该Activity能立即被回收。
原因就是Java中内部类(匿名内部类也一样)会有宿主类的强引用。也就是this变量的来源。是编译默认行为。用javap查看class文件可以看出。
注意看this$0,就是对宿主类的引用。
结论:在内部类中这种内存泄露一般很容易被忽略,比如经常会在Activity onDestroy中进行一些回收,或者同步工作,这时也应当避免做耗时的操作,就算耗时操作用匿名内部类的Thread来做,也同样可能造成泄露。