抖音卡顿原因性能分析案例
最近刷抖音,发现刷的时间久一点就能感觉到明显卡顿,严重影响使用,需要强杀APP才行。偶尔一次还好,次数多了,一方面影响了使用体验,一方面出于安卓开发的职业,手机性能也不低,跑的也是大厂APP,为什么会有这么明显的卡顿呢。比较好奇到底是什么原因导致的,本文就来分析一下,当做性能优化的练习题。
因为我用的是小米手机,使用的澎湃系统。 因为是新系统,一开始怀疑是系统方面有BUG。首先手机配置不算低,料想CPU没问题,看了下16内存还有7G剩余也是足够,1T空间还有一半没用,也不会是IO瓶颈。那只能是CPU调度上有问题,之前也看过一个关于小米手机的性能优化案例,因为CPU对进程调度以及系统刷新优化方面缺陷,会导致APP卡顿。具体来说就是将应用主线程调度到小核上了,小核的频率也没有以最高频率问题,也就是摆核问题。然后就想开启小米手机的性能模式,这样应该可以增加大核心的使用机会。一开始修改以后心理上感觉是流畅不少,不过好景不长,用了一段时间又遇到了抖音卡顿问题。开着性能模式还能卡顿非常厉害,更加好奇了。
因为抖音是三方app咱没有源码,ASprofiler没法调试,直接上Perfetto抓取。
遇到第一个问题,抓取的日志没有包名,只有进程ID号。使用adb top命令查看占用CPU最多的前台应用,应该就是开着的抖音
adb shell top -n 1
卡顿现场的图找不到了,补的图。现场进程ID是1326,
然后看1326进程的掉帧确实非常严重,都是红的。中间有大片的主线程等待。为什么会有主线程等待呢,一开始怀疑是等待的子线程执行效率低,摆核在小核上了,还是倾向于是小米系统问题
跳转主线等待的线程
发现是在执行长时间的GC操作,而且非常多线程包括主线程在等该线程唤醒,也就是锁竞争
看一下AS的gc日志,发现在不停的做GC,基本可以肯定是抖音APP的内存问题
使用命令查看一下进程的内存信息
adb shell dumpsys meminfo 1326
可以看到总内存占用2.2G,独占内存RSS 1.6G 特别是java的堆内存占用到了534M了,虽然整个手机16g内存剩余7g是充裕的,但是超过单个APP进程的堆内存上限了,难怪一直在执行GC操作。
想dump一下抖音内存,看看是什么原因导致的内存占用过大还回收不了,大概率就是内存泄漏问题。发现第三方应用没有dump权限,可惜了。
adb shell
am dumpheap 1326 /data/local/tmp/app_dump.hprof
后期有空使用root设备试试再dump吧,有其他获取方法或者意见建议欢迎告诉我哦。