**
安卓性能优化之内存管理
**
凡物讲究“物尽其用”,将某些东西发挥它最大的功效可谓是“功德圆满”,在安卓开发中内存的使用上非常契合这一理念,毕竟内存是很有限的,一旦超过限度会造成很多错误以及一些让人反感的卡顿现象,所以要坚决反对一切“站着茅坑不**”的现象。
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.经过一系列优化改造之后内存的分配已趋于平稳,鄙人水平有限,来回往复的看也挖掘不出其它还有优化余地的地方,暂且就这样了,嗯…