利用-Android-Studio-Profiler-工具解析应用的内存和-CPU-利用数据
https://i-blog.csdnimg.cn/blog_migrate/eb8dd9dc8df87a92fde693a54e6d3bd7.png由于一旦删除赤色节点,别的的橙色节点都将无法被访问,这时候它们就会被 GC 接纳掉。从这个角度上讲,它们是被赤色节点所持有的,因此被定名为 “Retained Size”。
另有一个前面没有提到的数据维度。当您点击某个类名,界面中会显示这个类实例列表,这里有一列新数据 —— “Depth”:
https://i-blog.csdnimg.cn/blog_migrate/b882572e9c9f7db66b0d4678c96cf337.png
“Depth” 是从 GC Root 到达这个实例的最短路径,图中的这些数字就是每个对象的深度 (Depth):
https://i-blog.csdnimg.cn/blog_migrate/33d57f1fdb9e7b73675e8ec3f8f871f3.png
一个对象离 GC Root 越近,它就越有可能与 GC Root 有多条路径相连,也就越可能在垃圾接纳中被生存下来。
以赤色节点为例,假如从其左边来的任何一个引用被破坏,赤色节点就会变成不可访问的状态并且被垃圾接纳接纳掉。而对于右边的蓝色节点来说,假如您希望它被垃圾接纳,那您需要把左右两边的路径都破坏才行。
值得警惕的是,假如您看到某个实例的 “Depth” 为 1 的话,这意味着它直接被 GC root 引用,同时也意味着它永久不会被自动接纳。
下面是一个示例 Activity,它实现了 LocationListener 接口,高亮部门代码 “requestLocationUpdates” 将会利用当前 Activity 实例来注册 locationManager。假如您忘记注销,这个 Activity 就会走漏。它将永久都待在内存里,由于位置管理器是一个 GC root,而且永久都存在:
https://i-blog.csdnimg.cn/blog_migrate/f99bc3a590fdacd85f238274197f6a13.png
您能在 Memory Profiler 中查看这一情况。点击一个实例,Memory Profiler 将会打开一个面板来显示谁正在引用这个实例:
https://i-blog.csdnimg.cn/blog_migrate/c48014394224f4168ccaab1ada881b28.png
我们可以看到位置管理器中的 mListener 正在引用这个 Activity。您可以更进一步,通过引用面板导航至堆的引用视图,它可以让您验证这条引用链是否是您所预期的,也能帮您明确代码中是否有走漏以及哪里有走漏。
CPU Profiler
和 Memory Profiler 类似,CPU Profiler 提供了从另一个角度记录和分析应用关键性能数据的方法。
利用 CPU Profiler,起主要产生一些 CPU 的利用记录:
[*]进入 Android Studio 中的 CPU Profiler 界面,在您的应用已经摆设的条件下,点击 “Record” 按钮;
[*]在应用中举行您想要分析的操作;
[*]返回 CPU Profiler,点击 “Stop” 按钮。
由于最终呈现的数据是基于线程组织的,所以去观察数据之前,您应该确认是否选择了准确的线程:
https://i-blog.csdnimg.cn/blog_migrate/6ad10a1de6e85695f4fb9753545d7f07.png
我们这里所获得的 CPU 利用记录信息,着实是一个 System Trace 实例的调用栈聚集 (下文统称 “调用栈”)。而就算是很短的 CPU 利用记录,也会包罗巨量的信息,同时这些信息也是人无法读懂的。所以 CPU Profiler 提供了一些工具来可视化这些数据。
Call Chart
在 CPU Profiler 界面下半部,有四个标签页,分别对应四个不同的数据图表,它们分别是: Call Chart、Flame Chart、Top Down 和 Bottom Up。其中的 Call Chart 可能是最直白的一个,它基本上就是一个调用栈的重新组织和可视化呈现:
https://i-blog.csdnimg.cn/blog_migrate/9bd9f621de97eb1a962097d41e237853.png
Call Chart 横轴就是时间线,用来展示方法开始与结束的确切时间,纵轴则自上而下展示了方法间调用和被调用的关系。Call Chart 已经比原数据可读性高很多,但它仍然不方便发现那些运行时间很长的代码,这时我们便需要利用 Flame Chart。
Flame Chart
Flame Chart 提供了一个调用栈的聚合信息。与 Call Chart 不同的是,它的横轴显示的是百分比数值。由于忽略了时间线信息,Flame Chart 可以展示每次调用消耗时间占用整个记录时长的百分比。同时纵轴也被对调了,在顶部展示的是被调用者,底部展示的是调用者。此时的图表看起来越往上越窄,就好像火焰一样,因此得名:
https://i-blog.csdnimg.cn/blog_migrate/2a0f954d9ad94e6ac948d3a9800ef9c2.png
Flame Chart 是基于 Call Chart 来重新组织信息的。从 Call Chat 开始,合并相同的调用栈,以耗时由长至短对调用栈举行排序,就获得了 Flame Chart:
https://img-blog.csdnimg.cn/img_convert/ea5be23c1ba6f708d9c262ebc7541132.webp?x-oss-process=image/format,png
对比两种图表不难看出,左边的 Call Chart 有详细的时间信息,可以展示每次调用是何时发生的;右边的 Flame Chart 所展示的聚合信息,则有助于发现一个总耗时很长的调用路径:
https://i-blog.csdnimg.cn/blog_migrate/c223f6f21fd844b9eb6e04f20eb2ac74.png
Top Down Tree
前面介绍的两种图表,可以资助我们从两种角度纵览全局。而假如我们需要更准确的时间信息,就需要利用 Top Down Tree。在 CPU Profiler 中,Top Down 选项卡展示的是一个数据表格,为了便于明确其中各组数据的意义,接下来我们会尝试构建一个 Top Down Tree。
构建一个 Top Down Tree 并不复杂。以 Flame Chart 为基础,您只需要从调用者开始,持续添加被调用者作为子节点,直到整个 Flame Chart 被遍历一遍,您就获得了一个 Top Down Tree:
https://img-blog.csdnimg.cn/img_convert/c7fb8b0348e40f0ff241b23cfe034512.webp?x-oss-process=image/format,png
对于每个节点,我们关注三个时间信息:
[*]Self Time —— 运行本身的代码所消耗的时间;
[*]Children Time —— 调用其他方法的时间;
[*]Total Time —— 前面两者时间之和。
有了 Top Down Tree,我们能容易将这三组信息归纳到一个表格之中:
https://i-blog.csdnimg.cn/blog_migrate/1b09c08761315e121d82e39f7c94e747.png
下面我们来看一看这些时间信息是怎么计算的。左手边是和前面一样的 Flame Chart 示例。右边则是一个 Top Down Tree。
我们从 A 节点开始:
[*]A 消耗了 1 秒钟来运行本身的代码,所以 Self Time 是 1;
[*]然后它消耗了 9 秒中去调用其他方法,这意味着它的 Children Time 是 9;
[*]如许就一共消耗了 10 秒钟,Total Time 是 10;
[*]B 和 D 以此类推…
值得注意的是,D 节点只是调用了 C,本身没做任何事,这种情况在方法封装时很常见。所以 D 的 Children Time 和 Total Time 都是 2。
下面是表格完全展开的状态。当您在 Android Studio 中分析应用时,CPU Profiler 会完成上面所有的计算,您只要明确这些数字是怎么产生的即可:
https://i-blog.csdnimg.cn/blog_migrate/25e3c2831dfb967fdf3127eb79431a67.png
对比左右两边: Flame Chart 比较便于发现总耗时很长的调用链,而 Top Down Tree 则方便观察其中每一步所消耗的准确时间。作为一个表格,Top Down Tree 也支持按单独维度举行排序,这点同样非常实用。
Bottom Up Tree
当您希望方便地找到某个方法的调用栈时,Bottom Up Tree 就派上用场了。“树” 如其名,Bottom Up Tree 从底部开始构建,如许我们就能通过在节点上不绝添加调用者来反向构建出树。由于每个独立节点都可以构建出一棵树,所以这里着实是森林 (Forest):
https://img-blog.csdnimg.cn/img_convert/fd8567bd822c7e90583b6d3bf4daa1a9.webp?x-oss-process=image/format,png
让我们再做些计算来搞定这些时间信息。
表格有四行,由于我们有四个树在森林中。从节点 C 开始:
[*]Self Time 是 4 + 2 = 6 秒钟;
[*]C 没有调用其他方法,所以 Children Time 是 0;
[*]前面两者相加,总时间为 6 秒钟。
看起来与 Top Bottom Tree 别无二致。接下来展开 C 节点,计算 C 的调用者 B 和 D 的情况。
在计算 B 和 D 节点的相关时间时,情况与前面的 Top Bottom Tree 有所不同:
[*]由于我们在构建基于 C 节点的 Bottom Up Tree,所以所偶然间信息也都是基于 C 节点的。这时我们在计算 B 的 Self Time 时,应当计算 C 被 B 调用的时间,而不是 B 自身执行的时间,这里是 4 秒;对于 D 来说,则是 2 秒。
[*]由于只有 B 和 D 调用 C 的方法,它们的 Total Time 之和应与 C 的 Total Time 相称。
下一个树是 B 节点的 Bottom Up Tree,它的 Self Time 是 3 秒,Children Time 是用来调用其他方法的时间,这里只有 C,所以是 2 秒。Total Time 永久都是前两者之和。下面便是整个表格展开的样子:
https://i-blog.csdnimg.cn/blog_migrate/ff128cd80afca1c0b0ef8062992e86f8.png
当您想要观察某个方法怎样被调用,好比这个 nanoTime() 方法时,您可以利用 Bottom Up Tree 并观察 nanoTime 方法的子节点列表,通过右边的时间数据,您可以找到谁人您所感兴趣的调用:
https://i-blog.csdnimg.cn/blog_migrate/0dbae2d87bb5c08f55d023116d519981.png
备忘表
前面介绍了四种不同的数据图表,并且还详细表明确一些数据是怎样被计算出来的。假如您觉得头绪太多很难记着,没关系,下面这个简明的备忘表就是为您准备的:
https://i-blog.csdnimg.cn/blog_migrate/0124b9c3c9bfa9ef208e762ece7e8476.png
总结
本文介绍了 Android Studio Profiler 中的两种数据分析工具。
其中 Memory Profiler 可以自动检测 Activity 和 Fragment 的内存走漏,而通过相识和利用 Memory Profiler 中数据分析功能提供的数据,也可以发现和办理其他类型的内存走漏题目。
有关 CPU Profiler 则介绍了 Call Chart、Flame Chart、Top Down、Bottom Up 这四种维度的数据呈现。
希望这些内容能够资助您更加相识 Android Profiler。如仍有疑问,欢迎在下方留言。也欢迎通过 Android Studio 反馈利用中遇到的题目。
https://i-blog.csdnimg.cn/blog_migrate/095cbe146128a6fc5237ed3737f09d21.png
作者:Android_开发者
链接:https://juejin.im/post/5ef2c6e9f265da02b80e0b6d
文末
很多人在刚打仗这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些题目,好比学了一段时间感觉没有方向感,不知道该从那边入手去学习,对此我整理了一些资料,需要的可以免费分享给大家
这里笔者分享一份本身收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(现实上比预期多花了不少精力),包罗知识脉络 + 诸多细节,由于篇幅有限,这里以图片的情势给大家展示一部门。
https://i-blog.csdnimg.cn/blog_migrate/91ed2a2fad0bb3d92ab251c8fe26e64a.png
https://i-blog.csdnimg.cn/blog_migrate/577f78246964ad3101a3d7b6cc779890.png
【视频教程】
https://i-blog.csdnimg.cn/blog_migrate/a07662499c7a7ada3659eeab8aa8ce5f.png
天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来资助,假如有题目,请在批评区留言。
《Android学习条记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
…(img-YpJPWcSd-1715185754716)]
天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来资助,假如有题目,请在批评区留言。
《Android学习条记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]