[Android systrace系列] systrace最实用一招

systrace最吸引人的地方,在于当你不了解所有业务逻辑时,依然可以通过线程间的阻塞关系,快速定位问题。

有了这篇文章的铺垫,后续的文章再开始分享技巧。

----------------------------------------------------------------------------------------------

这篇文章的小目标:学会分析线程间的阻塞关系

-----------------------------------------------------------------

 

之前,我们通过[Android systrace系列] systrace入门第一式学会了下面这些:

放大缩小视图

CPU各个核在各个时间点运行的线程

流程之间的从属关系,以及各流程的耗时

线程的运行状态(就绪,运行中,睡眠等等)

 

在介绍最实用一招前,描述一下我对性能问题的粗浅理解。

我们可以将发生性能问题的部件划分为三类:

1)计算单元,例如CPU和GPU等

2)存储单元,例如闪存、硬盘和内存等

3)以上两者的连接部分,例如总线、网络等等。

问题的类型,也可以分为两种:能力不足以满足 和 能力无法有效发挥。

这两个方面交织起来,就有6种情况,举几个例子,

对于CPU,运算量太大导致运行时间长是属于前一种,而代码逻辑导致进程阻塞是后一种。

对于内存,内存申请量大,导致需要回收内存属于前一种,而剩余内存够,但分配算法不良导致碎片过多,没有足够的连续可分配空间则属于后一种。

 

性能分析中进程相关的部分,学会这一招可以解决不少问题。

阅读完下面的文章,你能体会到,A线程唤醒B线程,意味着A线程阻塞了B线程,B线程等待了A线程。

通过不断回溯被唤醒的顺序,基本能找到阻塞问题的源头。

讲述这一招的操作,我最喜欢的文章:

https://www.androidperformance.com/2019/07/23/Android-Systrace-Pre/

翻译腔官方文档:

https://developer.android.google.cn/topic/performance/vitals/render

官方文档的网友翻译:

https://zhuanlan.zhihu.com/p/27065828

有了以上优秀的文章,我欣喜而又遗憾地,将操作的讲述省略了。

在这些文章中付出耐心,十分值得,因为技能树马上就能点亮了。

 

能够无视千万行代码逻辑,通过线程阻塞关系,定位问题的感觉,太好了。

毕竟有时定位完问题,就可以转bug了^^

 

 

转载请注明出处:https://www.cnblogs.com/zzcperf/p/13992164.html

 

posted @ 2020-11-29 21:22  zzc1024  阅读(570)  评论(0编辑  收藏  举报