本文地址:http://blog.csdn.net/iamws/article/details/51636175
第二篇:理论
通过之前前篇介绍的工具,我们知道了应该怎么样去获取要分析的数据,但是也仅仅局限在于怎么样获取数据,而没有深入数据分析,这一篇主要讲解的是UI刷新这块部分android理论知识,有了这些知识后,对于上面的数据该怎么分析,你就胸有成竹了。
ps:本文只是个人理解后的总结,并不会深入源码层次分析,如有错误,还请麻烦各位帮忙指正~
这篇文章要解决的理论问题如下:
1、什么是内存泄漏,内存溢出,这块对性能有什么影响以及android GC的种类
2、网上说的android UI刷新是60fps/16ms一次是什么样的一回事
3、android的整体绘制原理
4、view动画和属性动画区别
5、过度绘制会导致什么问题
6、硬件加速制的时候你是否对画布使用了lockcanvas()方法
7、哪些操作是耗费CPU的
8、其他性能优化注意点(想到后再加上)
如果对以上知识已经了解的话,那就麻烦跳过这篇,期待下一篇实战举例吧(┬_┬)
好了,开始
第一:什么是内存泄漏,内存溢出,这块对性能有什么影响以及android GC的种类?
(这块需要对GC有一些了解,了解了java GC的这块知识后下面就很好理解了)
由于android是个移动设备上的操作系统,没有了PC上的硬件支持,所以对于系统cpu,内存资源都需要额外关注,这才是为什么要很注意性能问题;
内存泄漏:简单讲就是之前创建了对象,也分配了内存给它,但是后来这个对象没用了,本来应该要交给系统去回收,但是对象却由于一直被GC ROOT上存在引用链导致无法回收,然后这部分内存就一直被占用了,如果每次操作都会生成这个对象的话,将会逐渐吞噬app的内存剩余空间,最终结果就是导致内存被吃完了,然后抛出溢出异常
内存溢出:常称OOM,out of memory,一般玩图片加载不注意的时候很容易碰到这个异常,这个其实是一个app在任何android手机运行的时候,都会是 linux给fork出虚拟机(例如:dalvik)进程跑的,而每个虚拟机创建的时候就会给他当前系统规定的可使用内存大小,如果你的app某个操作导致要使用的内存超过了这个分配值,而且GC后剩余的内存都没办法给你足够的空间去分配,那么这个异常就出来了
android GC种类:我们在android的logcat中输入GC关键字,可以看到GC基本上有以下这几类:
GC_FOR_MALLOC: 表示准备在堆上分配内存时内存不够触发的GC
GC_CONCURRENT: 表示是在当前内存达到一定设置量后导致触发的GC
GC_BEFORE_OOM: 表示是在准备抛OOM异常之前进行GC
GC_EXPLICIT: 表示是程序中主动调用System.gc、VMRuntime.gc接口或者收到信号时触发的主动GC
ps:android GC相关的知识推荐可以看看老罗写的博客,友情链接:http://blog.csdn.net/luoshengyang/article/details/41822747
可以看到上面除了主动代码或者信号调用以外,其它的GC都是在内存分配过程中调用的,而GC过程是需要涉及到CPU计算的,同时GC过程分为挂起或者与其他线程并行两种模式,这时候大家就明白为