android 对象滥用导致内存泄漏之性能篇

  1.单例模式

      频繁使用的对象尽量多应用单例模式,饿汉式跟懒汉式加载。

      注意:但是小心单例模式造成的内存泄漏,

                    比如:

public class DeviceManagerFactory {
    private static DeviceManagerFactory singleton;

    private DeviceManagerFactory(Context context){}

    public static DeviceManagerFactory getInstance(Context context){
        if(singleton == null){
            synchronized(DeviceManagerFactory.class){
                if(singleton == null){
                    singleton = new DeviceManagerFactory(context);
                }
            }
        }
        return singleton;
    }
 
 
}
    那么问题来了,如果是上述对象的引用在activity中引用的话,当我们退出程序时,发现activity并没有被销毁,因为我们在activity中调用该实例时,会传入activity对象,android垃圾回收机制会认为该实例在使用状态,所以退出应用后不会被回收,造成内存泄漏。
我们该如何改呢?
    
    private DeviceManagerFactory(Context context){
 
 
    this.context = context.getApplicationContext();
  }
通过上述修改,我们把该实例的生命周期跟程序应用绑定的话,当程序销毁时,该实例自然会被回收。

2.自动装箱问题

    当我们使用数据类型的包装类的时,比如Integer,Float等进行加减时,他会先将包装类转化为int,float等数据类型进行加减(自动拆箱),加减完成之后会进行自动装箱,相当于又重新创建了一个对象,如果是一个for循环操作的话,会加大垃圾回收的压力甚至会anr。

3.慎用容器

    如arraylist,hashmap等,它们内部都有自动扩容机制,如果判断容器内部不够使用,那么会扩充为原来的俩倍,导致终端内存占用。

4.activity对象

    一.启动模式注意合理应用,默认为standard,每次Intent请求都会重新创建。

    二.横竖屏切换都会重新创建activity,onConfigurationChanged重写这个判断

5.注意字符串拼接

如:

String s = "";

for(){

        s +=i;    

}

像上面那种拼接手法循环几次会初始化几个stringbuffer或stringbuilder,因为拼接说到底都会用stringbuilder来进行拼接,然后赋值。

解决方法:可以先新建一个stringbuilder,然后用stringbuider对象来进行拼接;或者使用string.format来进行。

6.减少布局层级

7.不要滥用线程,这个我会再下一篇着重总结一下线程问题的,请持续关注。


欢迎大家来补充或者建议。



猜你喜欢

转载自blog.csdn.net/no_loafer/article/details/79925732