近几天开发的过程当中,遇到了一个很棘手的问题:在没网络状况下OKHttp的任何请求,全都没有任何回应。想要查看线程的调用栈查看是哪里stuck了。
因而使用了AndroidStudio的工具。Monitors中CPU的Method tracing功能。这就是今天写这篇文章的目的。android
(Android Studio的Method tracing功能)网络
Method tracing的做用就是监听一段时间内,某个进程的某个线程,执行的全部方法,以及各个方法所消耗的时间。而后开发者能够从中找到一些蛛丝马迹来推断出程序中的一些问题。app
(这就是分析出来的method trace文件)less
x时间轴选择。async
(x时间轴)
关于时间轴的解释,我查了下google:工具
Wall Clock Time - Total CPU time elapsed between the method call and return.google
Thread Time - Total time during which the JRE scheduled the thread during call processing. It’s less than or equal to the Wall Clock Time: less if the JRE interrupted the thread, and equal if it didn’t. The thread might not run continuously; when it’s not executing, that time is excluded. If threads are interrupted often and it’s not by design, the interruptions affect app performance. However, an example of a by-design use is synchronous operations that take a long time, such as file transfers and reads from disk, where the method could be the asynchronous wrapper for the synchronous reader.spa
大体理解一下:
Wall Clock Time,计算整个CPU时间,一个方法从开始到return,都会计算在内。
Thread Time,从整个CPU时间,减掉可能由JRE中断线程的时间。线程
OK这里就选择Wall Clock Time。orm
(Arrays.copyOf方法的调用详情)
首先,最显眼的东西就是这个黄色的长条条了,每一个长方形都是一个方法,长度表明这个方法执行的时间(就是上面我们选择的Wall Clock Time啦)。Inclusive Time是指copyOf以及它的子方法调用的时间,占整个线程执行时间的占比。Exclusive Time与Inclusive Time相对,它不统计子方法执行的时间。
进一步分析,copyOf长方形的的上面的方法是ArrayList.grow方法,下面的长方形是...嗯也是一个copyOf。其实这个上下关系,就正是父子关系。即copyOf是ArrayList.grow的一个子方法。
那...咱们其实根本不想分析这些很细节的方法,咱们只关心咱们本身写的方法的调用顺序或者调用耗时。那该怎么作呢?
例如说,我本来的目的实际上是查看被stuck的网络请求。我能够从中获得什么信息?首先,我查看的是本身写的方法,并不是底层的方法,那么我要查看的长方形就在上面。其次,我想查看的是stuck的方法,那么它最终必定没有执行完毕,那么我要查看的长方形必定在最后。
那么,选中想要的线程,拉到最后:
(最后的横截面)
这个最后的横截面,就是没有执行完的方法的调用栈。再看最后一个长方形:
(libcore.io.Posix.android_getaddrinfo)
那么这个线程最终卡在了这一步。至此,我达到了个人目的。
(方法统计表格)
有四栏数据,分别是:方法名称,方法调用次数,包含子方法的调用时间,不包含子方法的调用时间。
其实一开始写这篇文章以前,Method tracing的好多功能我都不知道是什么。想着要记录一下终于使用这个工具达到了个人目的,而后记录下来这个过程。写文章的过程当中,反而发现不少东西都不懂,这就须要去查资料。结果就真的查出了好多恍然大悟的知识点。每次写完一篇文章都收获很大,要告诉本身记住这样的感受,之后有所收获必定要不怕麻烦,把它换成文字,一来记录本身的所得,二来能够梳理这些知识点,甚至有时候能够获得写文章之前不知道的东西。