systrace最吸引人的地方,在於當你不瞭解全部業務邏輯時,依然能夠經過線程間的阻塞關係,快速定位問題。html
有了這篇文章的鋪墊,後續的文章再開始分享技巧。android
----------------------------------------------------------------------------------------------算法
這篇文章的小目標:學會分析線程間的阻塞關係網絡
-----------------------------------------------------------------性能
以前,咱們經過[Android systrace系列] systrace入門第一式學會了下面這些:google
放大縮小視圖spa
CPU各個核在各個時間點運行的線程線程
流程之間的從屬關係,以及各流程的耗時翻譯
線程的運行狀態(就緒,運行中,睡眠等等)orm
在介紹最實用一招前,描述一下我對性能問題的粗淺理解。
咱們能夠將發生性能問題的部件劃分爲三類:
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