安卓性能优化之内存管理

**

安卓性能优化之内存管理

**
凡物讲究“物尽其用”,将某些东西发挥它最大的功效可谓是“功德圆满”,在安卓开发中内存的使用上非常契合这一理念,毕竟内存是很有限的,一旦超过限度会造成很多错误以及一些让人反感的卡顿现象,所以要坚决反对一切“站着茅坑不**”的现象。


1.运行MemoryBugs程序点击STARACTIVITYB按钮
这里写图片描述

LeakCanary立即给出内存泄露提示
这里写图片描述
进入详情页面显示出MainActivity中存在内存泄露现象。
这里写图片描述
而造成泄露原因是由于static的sTextView存在对MainActivity的引用从而只有MainActivity的单例使得MainActivity无法被GC。
翻转屏幕并打开Heap Viewer可以看到之前的MainActivity并没有被垃圾回收这里写图片描述

在MainActivity只需取消sTextView static修饰
这里写图片描述


2.点击STARTALLOCATION并且开启Memory Monitor以及Allocation Tracker
这里写图片描述
可以看出在某个时刻存在大量创建对象的现象关闭Allocation Tracker可以在MainActivity中反复创建了Rect,StringBuilder。
这里写图片描述
这里写图片描述
这里写图片描述
一旦垃圾回收可能会存在耗时过长从而导致页面运行不流畅完全没必要在for循环中不断创建Rect对象。
这里写图片描述
对象的创建最好只有一次。
这里写图片描述
而且听闻在项目中中并不建议使用Java中的System.out.println(),而推荐使用打Log的方法使其显示在控制台上。


3.Handler存活周期较长,甚至超过MainActivity的存活时间,而Handler持有对它的引用,在MainActivity被Destory后Handler并未随之而去,从而导致内存的泄露,除非Handler自己先寿终正寝,显然这是一大隐患。所以在这里显然不可这么明目张胆的使用。
这里写图片描述
一旦Handler进行耗时操作(这里讲原先的5000改为了50000
这里写图片描述
立马被打回原形,导致内存泄露。
这里写图片描述
这时候应该使用静态内部类来代替外部类,以及WeakReferences使得在MainActivity被销毁时,Handler同时一起被回收,避免了内存泄露。
这里写图片描述
这里写图片描述


4.类似的在MyView类的onDraw方法中系统提示我们最好避免在这类方法中创建对象因为onDraw方法调用的频率较高从而导致性能的问题
这里写图片描述
可将它们提取为全局的变量

这里写图片描述

5.经过一系列优化改造之后内存的分配已趋于平稳,鄙人水平有限,来回往复的看也挖掘不出其它还有优化余地的地方,暂且就这样了,嗯…
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值