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


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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值