Android性能优化之内存优化&启动优化

内存优化

内存检测工具

  1. Memory Monitors
    Memory Monitors是Android Studio中的工具,通过图形界面的方式比较直观的看到内存抖动的情况,还可以手动触发GC,配合内存快照,可以准确的看到哪些地方存在内存泄漏。
  2. LeakCanary
    LeakCanary是一个检测内存泄漏的开源类库,使用比较简单。可直接在gitHub找到。
    在应用内做相应的配置后,安装完应用后,会自动安装一个检测的apk,操作应用产生内存泄漏之后,通知栏就会有通知,点击即可查看详细报告
    3.Android Lint 
    Android Lint是SDK中提供的比较常用的检测工具,但是很多时候只是将它作为对xml资源的一个检测工具简单使用,实际上Android Lint是功能非常强大的工具,也可以检测出内存泄漏
    4.Heap Viewer SDK中带的一个工具,功能同Memory Monitors一致,不如Memory Monitors直观
     

内存优化方案

1.内存泄漏,是指已经用不到的内存对象,但垃圾回收机制没有把这个对象回收,造成的内存空间占用。内存泄漏会导致系统可使用的堆内存越来越少,从而频繁GC,如果GC耗时较多会出现丢帧卡顿的情况(因为Dalvik虚拟机在GC时,会暂停应用的线程)。
2.内存溢出(OOM),是指请求的内存空间超过了系统能为应用分配的堆内存空间时,会发生内存溢出,最终导致应用崩溃。
3.未关闭资源,如Cursor、File文件等,不使用时应该及时关闭。
4.及时注销不用的注册对象,如广播,Provider观察器等,其次是add开头的注册监听方法。这些大多都是按照观察者模式(发布订阅模式)设计的,内部会维护一个注册集合,一直持有该对象的引用,导致无法垃圾回收。
5.非静态内部类的滥用(匿名内部类尤甚)。非静态内部类会隐式持有外部类的引用,如果非静态内部类创建了一个静态实例或者做了耗时处理,都会一直持有外部类,导致无法回收。
6.AlertDialog导致的内存泄漏,由于AlertDialog中持有Activity的引用,所以Activity失去焦点时就dismiss它。
7.静态变量的滥用(单例) 。静态变量的生命周期可以等同于整个进程,如果在静态变量中储存了一些数据,在进程退出前,这些数据是无法被回收的。比较常见的一种情况是单例的使用没有处理好,比如在单例中保存了非全局的Context引用,导致被引用的对象无法被回收
8.Handler阻塞导致对象无法及时回收
通常会在主线程创建Handler用于消息通信,当Handler被阻塞时,发出的Message就会一直储存在MessageQueue中,导致Handler无法被及时回收,从而导致Activity或Service不能及时回收,,因此在组件退出时应当清空任务队列。另外handler内持有外部类的弱引用也可以避免一些问题。
9.AsyncTask造成的内存泄漏,异步任务中持有了外部类的引用,如果异步任务未完成,会一直持有外部类引用,造成资源无法回收。
10.Service完成任务后,及时关闭它,因为service的等级虽然低但不是最低也不容易被回收,且在主线程中运行,不可做耗时操作,可以使用IntentService来替代,IntentService里面维护了子线程,执行完会自动关闭。
11.UI不可见的时候尽量释放掉只有UI使用的资源
12.滥用Bitmap造成的内存泄漏,使用完后调用recycle(),来释放内存。使用图片的时候,软引用引用Bitmap,并且配合LRU缓存算法处理。
13.避免使用依赖注入的框架(如ButterKnife和Dager2),虽然会方便开发,但是它们会扫描代码中的注解,占用额外的资源.
14.使用多进程,消耗内存过大如推送、webView可以开启多进程,但是会出现数据传输和优化的问题。

启动优化

冷热启动

1.冷启动:应用启动前,系统中没有任何该应用进程的信息,然后启动该应用。从Zygote进程fork创建出一个新的进程,创建和初始化Application、创建MainActivity,显示布局内容
2.热启动:用户使用返回按钮退出应用,然后马上重新启动应用。该应用的进程已经保留在后台,直接启动进程即可 不会走创和初始化Application,直接创建Activity。
3.冷启动时间计算:从进程创建到第一个Activity创建完毕为止,布局可见。

优化方案

1.启动白屏问题:
在全局的Theme中添加windowIsTranslucent和windowNoTitle,将这两个属性都设置成true。或者设置一个纯色背景加logo的背景主题。
2.减少在Application中的耗时操作,以及第三方的初始化(可以通过懒加载的方式),Application中不要以静态变量存数据。
3.减少所有的onCreate()中的耗时操作。

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家

领取方式:Android技术交流群653583088

猜你喜欢

转载自blog.csdn.net/qq_43257419/article/details/88721161
今日推荐