为何Android使用非静态内部类容易造成的泄漏!

版权声明:欢迎你来转载,不过请带个此Blog链接! https://blog.csdn.net/luojiusan520/article/details/52469628

前言

先看完下面这些也许答案才能明白:

静态变量与静态方法:数据存放的位置与普通变量方法不同;存放在data segment(数据段)指的是你程序运行之前就已经存进去数据了;
普通变量与普通方法:存放堆栈与方法区内,程序运行后才生成;

所以时间都不平衡的两类数据是不能已经要存的调用未来的数据(静态调用非静态);理解这个时间顺序一系列问题也就可以解决了;

再理解静态内部类与非静态内部类(咱不背规则咱要弄懂实际从而衍生规则)。

非静态的内部类:依赖于外部类的实例(因为由于有实例非静态数据才生成所以必须依赖),故可以使用外部类任何数据,弊端:但是就算外部类没用了也不GC掉,他还被内部类占有所以一般容易造成内存泄漏;
静态内部类:不依赖于外部,本意(个人理解)相当于重新建立的一个新类,所以不能引用外部非静态成员,想想可知,不依赖外部却要使用外部还没有生成的数据肯定不行。(挺绕的多读几遍顺顺)

扯了如此多 再扯扯为何要JAVA弄如此麻烦有内部类!!
因为继承:如果一个类只能继承一个!那我加个内部类不就继承两个拉!我想这是JAVA设计者原本的心态但是又发现一系列问题不能处理所以又引入接口,(所以一般现在内部类都是你写代码时候图快捷的方法不是其他什么原因;我是没想到能使用内部类的时候为何不可重新创一个新类,使用新类的时候不怕代码逻辑看起来杂也能放一个文件里面当内部类处理。(个人理解:就是要敢于个人理解!)

重点

由于Android 许多类牵扯到四大组件与各种资源,然而这些对象又是相比一般类特别耗内存的对象。
如果使用非静态内部类。当非静态内部类没有销毁的时候会一直占有其外部类的实例,当外部类实例退出比如Activity退出,service销毁,内部类占有实例。导致GC不销毁其在内存中的占有。就造成内存泄漏问题。

内存优化注意点

尽量使用Application的Context而不是Activity的
使用弱引用或者软引用
手动设置null,解除引用关系
将内部类设置为static,不隐式持有外部的实例
注册与反注册成对出现,在对象合适的生命周期进行反注册操作。
如果没有修改的权限,比如系统或者第三方SDK,可以使用反射进行解决持有关系
观察对象生命周期,尽量保持长生命周期不引用短周期的,应当释放掉或者做另外处理(弱引用)。

猜你喜欢

转载自blog.csdn.net/luojiusan520/article/details/52469628