1.内存优化
检测方法耗时信息使用TraceView或者AS自带Profile工具,实现原理:
Debug.startMethodTracing("TraceView”);//生成TraceView文件进行分析
Debug.stopMethodTracing();
内存优化
从内存抖动,内存泄漏,大对象使用比如bitmap等方面着手进行内存优化
内存抖动是由于短时间内有大量对象进出新生代导致的,它伴随着频繁的GC,gc会大量占用ui线程和cpu资源,会导致app整体卡顿。
避免发生内存抖动的几点建议:
- 尽量避免在循环体内创建对象,应该把对象创建转移到循环体外。
- 注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
- 当需要大量使用Bitmap的时候,试着把它们缓存在容器中实现复用。
- 对于能够复用的对象,可以使用对象池将它们缓存起来。
内存泄漏的场景:
1.单例引用短生命周期对象
2.注册回调之后没有反注册,比如listener, receiver
3.资源使用之后未关闭,比如数据库访问curson对象
4.handler内存泄漏
可以作为GC Root的对象:
1.java虚拟机栈即线程栈中引用的对象,比如执行方法中的参数,局部变量等
2.native虚拟机栈中引用的变量,即native方法中通过jni引用的java对象
3.方法区中的静态变量,常量引用的对象
内存优化建议
- 慎用Service改用intenService,任务执行完成后会自动停止
- 考虑使用ArrayMap,SparseArray替代HashMap
- 图片BitMap使用时要进行压缩处理,不要整个读到内存中很容易出现OOM
- 不要频繁创建对象,要使用对象缓存池复用
- 使用ProGuard简化代码:proGuard除了混淆功能以为,还会删除无用代码,资源文件,将类名,方法名,变量名简化成a,b,c从而节约内存。
- 使用多进程分担app进程压力,比如WebView初始化,下载模块等都可以使用新进程
内存优化相关:
内存占用情况分析
(1).线下开发环境:可以使用AS自带的Profile工具可以很方便的帮我们分析出内存占用情况和内存泄漏监测
(2).线上环境:通过调用Debug.dumpHprofData(String fileName):获取当前内存快照信息保存到Hprof文件中。
使用第三方库来解析hprof文件,hprof文件中包含所有对象的实例信息,实例信息中包括对象的个数和对象占用内存的大小。
内存泄漏也是通过分析hprof文件来收集泄漏对象的的引用链关系呈现给用户的:具体实现思路是
计算GC Root到当前对象实例最短引用链。
总体的思路是根据hprof文件的二进制协议将文件的内容解析成一个图的数据结构,然后广度遍历这个图找到最短路径,路径的起始点就是GCRoot对象,结束就是泄漏的对象.
为什么不能在线上实时监控内存快照信息?
(1).调用Debug.dumpHprofData(String fileName)获取内存快照信息时会bolck住应用所有线程,造成应用卡顿
(2).在内存泄漏监测过程中频繁调用GC操作会引起应用卡顿
(3).当发生内存泄漏时会频繁生成hprof文件,造成手机存储压力
解决方案:
线上监控各个页面占用的内存情况(系统分配的应用总内存大小,处于当前页面时app所占有的内存,当前页面相较于前一个页面时内存的增量),线上发现突增内存异常后,可以在线下分析原因进行分析。另外一方面可以通过动态下发开关决定哪个用户需要上传页面维度的内存快照信息,默认是不上传的,减少对用户的影响。
网友评论