安卓内存优化2 (软件使用及代码规范)

内存泄露

产生原因

一个长生命周期的对象持有一个短生命周期对象的引用,通俗讲就是该回收的对象,因为引用问题没有被回收,最终会产生OOM.

使用工具

1 Android Profiler的使用
在这里插入图片描述
Run菜单下的profile

内存抖动

产生原因

内存频繁的分配与回收,(分配速度大于回收速度时)最终会产生OOM
网上的例子太多了我就不举例子展示了直接上解决办法

解决办法

尽量避免在循环体内创建对象,应该把对象创建移到循环体外。
注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
当需要大量使用Bitmap的时候,试着把它们缓存在数组中实现复用。LRU三级缓存
对于能够复用的对象,同理可以使用对象池将它们缓存起来。如线程、图片复用池
对于String的拼接最好使用StringBuffer或者是StringBuilder

良好编码习惯

1.数据类型

  1. 不要使用比需求更占空间的基本数据类型,例如能使用short,就不要使用int和long类型
  2. static会由编译器调用clinit方法进行初始化,static final不需要进行初始化工作,打包在dex文件中可以直接调用,并不会在类初始化申请内存,所以基本数据类型的成员,可以全写成static final
  3. 字符串的连接尽量少用加号(+)

2 循环操作

  1. 尽量用foreach,少用iterator, 自动装箱尽量少用
  2. 最好不要new对象

3 数据结构与算法的解度处理

  1. 数组
    优点:两限制使得具有随机访问的特性。缺点:删除,插入数据效率低

  2. l链表
    插入、删除数据效率高。和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针


  3. 优点:提供后进先出的存取方式。缺点:存取其他项很慢。


  4. 优点:查找,插入,删除都快。缺点:算法复杂


  5. 优点:对现实世界建模。缺点:有些算法慢且复杂

  6. 队列
    优点:提供先进先出的存取方式。缺点:存取其他项都很慢

数据量千级以内可以使用
Sparse数组(key为整数),ArrayMap(key为对象)
性能不如HashMap但节约内存

4.枚举优化

  1. 每一个枚举值都是一个单例对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存
  2. 较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的IO开销,使我们的应用需要更多的空间
  3. 特别是分dex多的大型APP,枚举的初始化很容易导致ANR
  4. 用public static final 进行定义

5.重复申请内存的问题

同一个方法多次调用,如递归函数 ,回调函数中new对象,读流直接在循环中new对象等
不要在onMeause() onLayout() onDraw() 中去刷新UI(requestLayout)

6.避免GC回收将来要重用的对象

内存设计模式对象沲+LRU算法

7.Activity组件泄漏

1 非业务需求不要传activity的上下文,传application的上下文
2 和Activity有关联的对象写成static 如private static Button btn; private static Drawable drawable;
3 非静态内部类和匿名内部内会持有activity引用 (弱引用接收activity)
4 单例模式持有activity引用(弱引用接收接口等参数)
5 handler.postDelayed()问题 如果开启的线程需要传入参数,用弱引接收可解决问题,handler记得清除removeCallbacksAndMessages(null)

8.尽量使用IntentService,而不是Service

Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了Service这个概念。
那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR,为了解决这样的问题,引入了IntentService

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值