android 卡顿分析

Android出现使用不流畅,卡顿及ANR,主要原因有三个

1、CPU使用过高:

这个要排除是我们自己的APP还是有别的优先级更高的进程在占用APP,如果是我们自己的app占用CPU过高,那就需要对代码进行研究定位,比如定位操作,长时间的进行位置搜索会持续占占有CPU, 还有我们的常驻广播也是会占有CPU

2、系统内存使用过高:

一个是系统本身内存就小,还有同时打开的应用过多,这些都会占用内存,但是最主要的可能还是我们的代码不够规范从而造成的内存浪费,内存泄漏引起的内存使用过高。比如我们的死循环,递归,对象和变量等没有及时的回收,非常驻广播没有解除注册,长生命周期的持有短生命周期的引用,比如activity中的内部类会持有一个activity的引用,等等这些都有可能造成内存泄漏,内存泄漏过多最终就会导致OOM.所以我们一般会对app的性能进行检测,系统自带的StrictMode,studio的profiler 还有三方LeakCanary都是可以来帮助我们进行性能优化的工具。

StrictMode有两个检测策略:线程检测策略(ThreadPolicy)和虚拟机策略(VMPolicy)

ThreadPolicy检测:自定义的耗时操作,磁盘读写,网络请求

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy)
               .detectDiskReads()//检测在UI线程读磁盘操作
               .detectDiskWrites()//检测UI线程写磁盘操作
               .detectCustomSlowCalls()//发现UI线程调用的哪些方法执行得比较慢
               .detectResourceMismatches()//最低版本为API23  发现资源不匹配
               .detectNetwork() //检测在UI线程执行网络操作
               .detectUnbufferedIo()

VMPolicy检测:activity泄漏,closeable对象未关闭,sqlite使用完了未释放,对象实例的个数

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()//虚拟机策略(VmPolicy)
               .detectActivityLeaks()//最低版本API11 用户检查 Activity 的内存泄露情况
               .detectCleartextNetwork()//最低版本为API23  检测明文的网络
               .detectFileUriExposure()//最低版本为API18   检测file://或者是content://
               .detectLeakedClosableObjects()//最低版本API11  资源没有正确关闭时触发
               .detectLeakedRegistrationObjects()//最低版本API16  BroadcastReceiver、ServiceConnection是否被释放
               .detectLeakedSqlLiteObjects()//最低版本API9   资源没有正确关闭时回触发
               .setClassInstanceLimit(HXHelper.class, 1)//设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露

3、UI阻塞:

UI阻塞呢主要也是两个方面:一是主线程的消息队列中的消息过多,造成我们的UI界面的一些交互事件来不及处理,被阻塞

二是代码执行耗时,代码执行耗时呢,可能是因为代码本身执行起来就很耗时,比如IO操作,网络请求,还有一个原因就是等锁,可能执行到这里,锁被其他线程给占用了,需要等待。还有一个可能是UI界面布局太过复杂

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值