安卓性能分析

昨天听了王老师的直播课,深有感触啊,在此给大家分享一下

1.在直播中王老师已camera出图慢为例展开进行描述的,首先,既然出图慢,那我们采用工具systrace进行监控下camera启动的过程,看一下他到底是在干啥,通过systrace发现,对应的进程长时间处于runable状态,这个状态就是说我camer已经准备好工作了,等着cpu调度然后运行,但这个等待时间过长,导致肉眼能看到出图慢,因此我记继续通过systrace查看下cpu到底在干啥,通过systrace发现cpu调起了kswapd,说明内存确实不够了,需要通过内存回收和kswapd机制来增加可用内存。

2.通过上面1中的分析,发现是内存导致的,内存信息可以通过命令dumpsys meminfo 对应的pid进行查询,在此我们可以对比启动前后的内存,直播中的案例启动前后PSS内存相差大概1G

3.此时我们就在想,到底是谁申请这么多内存,内存有没有优化的方案,王老师介绍了他常实用的工具,adeb,这个工具其实就是咋安卓系统中,构建一个命令行的debian系统,这个系统集成了perf bpftrace,bcc等很多通用的内核分析工具,(这类工具非常有必要了解啊,只是工具不是王老师直播的重要,因此老师就没有介绍),当我们安卓上集成这个环境后,在pc端就可以执行命令adeb shell从而和手机进行连接调试

4.当环境准备好后,我们就可以采用perf进一步进行问题的定位了,其对应命令如下:
   
  通过上面的命令,我们可以获取到对应的堆栈信息,直播中的案例,很明显的看到调用了shrink_node,说明确实是慢速调用,且通过堆栈,我们能看到对应的应用业务调用接口,此时我们就可以采用两种方式处理问题,向上考虑业务上为什么要那么多内存,是不是实际用不了那么多,或者规避来处理,向下就是从内核内存的角度考虑如何能加快内存的申请

5.对于内存,其模型大概是:内存存量 + 内存回收速度 * t >= 内存的申请速度 * t,只要能保证这个模型,那问题就不大了,但若无法保证,那一定会因为内存不够而引起延时,从这个等式看,内存的优化就是三个方面,分别是增加存量,加快回收速率,降低实用速率

6.当我们按照4和5中的方向,优化内存后,就可以测试,看是否还存在出图延时问题,在直播中,王老师通过代码,来量化了优化指标,只是这个代码我没有,无法给大家展示

希望上面的内容对大家会有帮助啊
 


#安卓工程师##安卓开发#
全部评论
楼主厉害,至少指明了一种分析思路
点赞 回复 分享
发布于 2022-08-21 17:50 陕西
能搞性能的都是大神啊
点赞 回复 分享
发布于 2022-08-21 15:28 陕西

相关推荐

07-17 23:17
门头沟学院 Java
点赞收藏加关注这个系列还会长期更新的૮₍˃̶ꇴ˂̶₎ა想要免费点评,直接私信发我简历就行。我这里有大厂,最近做过的实习项目,可以用于包装简历,感兴趣,可以看简介中项目地址先看教育经历部分,还是缺少一些内容的,作为在校生,你可以把你的主学课程写一下奖学金,这个很优秀,但是在建议加一些比赛上去,这样会让在校经历更充实专业技能写的有些少了,怎么也要写个八到9点左右,然后你没有深入的内容,ioc,aop,多线程工具类,,CAS,还有部分集合的源码都可以学一下,然后写上去这些小知识点都是很加分的项目经历部分,首先,排版有一些问题首行缩进两格,项目亮点和上面的专业技能尽量对齐一下,应该分为这个项目的技术站,项目描述和项目亮点部分,技术站和技术描述要分开写。项目亮点部分就不要再写登录功能了,那你觉得好的功能可以往上放,放在前两到3点后四到5点也不要写登录,去包装一下别的,比如最后一个视频分段上传,你可以再加一个数据,比如1g的视频上传时间多久,每片是多少,到时候面试官可能会问你为什么要这么设计,这样包装才更好。第二个项目感觉都是一些基础功能,所以说看着很高大上,但这些高大上的功能都是这些技术栈本来就有的,虽说es很厉害,但是不建议写这么多es,很少用得上,写一些你对系统本身的优化和设计,用一些比较基础的技术栈的个人优势部分就没必要写了,作为一个在校生,把简历缩到一页,排版美观才是最重要的
点赞 评论 收藏
分享
07-22 16:09
已编辑
杭州电子科技大学 Java
电话面试(第一次电话面试,一般都是视频) 30-45分钟左右。面试官超级好,不会的会和你讲解。常规八股起手,由浅入深1 看我简历里写了RocketMQ,问我为什么项目里为什么用RabbitMq, 我分析了一下区别,说RabbitMq和spring集成更好,方便实现。RabbitMq速度好,能达到微秒级,就是吞吐量不如RocketMQ。RocketMQ适合分布式。 然后问我为什么速度快?没答出来。和我解释了一下 (Erlang 实现+异步写)。2 RocketMQ 组件,问我他们之间怎么连接 ,我只知道他们连接NameServe,不知道他们是长连接,然后聊了一下webSocket,短链接之类的。3 Jvm内存回收,直接八股开始吟唱 可达性分析+垃圾回收算法+分代回收。 被打断了,问我 elden区与suivival区内存比(我晕),Jvm启动时配置属性有哪些(寄 ),和我解释了 垃圾回收器(GC)配置+内存配置+日志与监控(懵了)4 看我项目用了redis ,怎么用: 缓存 + 分布式锁, 分布式锁怎么实现,为什么要有分布式锁,锁过期了怎么办(看门狗机制)。什么情况下会发生缓存雪崩、穿透、击穿,怎么解决 (参数校验+布隆+返回空值),(锁+设置合理过期时间),(随机设置过期时间)。上面我都举了我项目中的实际例子。5 设计模式 单例模式中双重校验锁怎么实现, 关键字, valatile+syncronized  valatile作用(防止指令重排序+可见性),new 对象三步( 分配内存+初始化零值+引用赋值) valatile防止指令重排序导致返回未初始化对象(我回答时往可见性方向走了 什么内存屏障,强制读取主内存什么的)。 类加载过程 ,双亲委派机制,类加载器在哪个包下(直接懵了)6 问了我Netty(听成了 .net 还以为c#呢) ,看我完全不懂,没问了。7 看出我是八股战神了,后面什么Mysql 索引为什么失效,索引过程什么的我就说我都会背,面试官就没问了。8 springboot启动过程,面试官直接说没看过源码说不清楚过程。直接说干了什么 。(导入bean @ SpringApplication启动实例,自动装载 META-INF/spring.factories 中配置的自动装配类,@EnableAutoConfiguration、@Configuration导入装配默认的 Spring Bean。@ComponentScan:自动扫描指定包及其子包中的 Spring 组件。)简而言之一句话,导入需要的bean。面试的过程中,对于我不懂的东西面试官会耐心的讲解,我有想法了也会直接反馈给面试官。整个面试过程不是单方面输出,更像是聊天。面试官说我没啥实际经验,不过实习生就是写写接口,不需要太会,基础够就行,面试官希望我能接触真实业务场景,也希望我能提高自己,不要仅限于八股。
查看13道真题和解析
点赞 评论 收藏
分享
评论
4
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务