背景
- 之前学习弱引用时误入了歧途,老是以为弱引用的对象在GC时就一定会被回收,其实不正确的!
纠正!
- 弱引用的对象只有在没有对象引用的情况下,GC,才会被回收!
- 例如:
A a = new A();
B b = new B(a);
- 此时如果
a = null;
,那么a不会被回收,因为被B强引用; - 如果改成:
A a = new A();
WeakReference<A> weak = new WeakReference<>(a);
- 则
a = null;
,a会被回收。
联系Android
- 非静态内部类导致的内存泄漏,基本都是因为内部类过长时间隐性强引用持有Activity对象,导致页面销毁时无法及时释放。因此往往会改成静态内部类,去掉隐性持有的Activity对象,并把Activity对象使用弱引用维护。
- 之前就会有个疑问:GC无法控制,那么正在使用Activity,此时内部类弱引用的Activity对象被回收,那不就各种异常了吗?
- 纠正之后才知道,内部类引用的Activity对象在Activity销毁时才没有对象引用,才会被回收