最后
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
这种情况不太常见,但在 Android 8.0 之后,使用 Bitmap 便可能产生此类情景,因为 Bitmap 会把像素信息存储在原生内存中来减少 JVM 的内存压力。
先从 “Shallow Size” 讲起,这列数据其实非常简单,就是对象本身消耗的内存大小,在上图中,即为红色节点自身所占内存。
而 “Native Size” 同样也很简单,它是类对象所引用的 Native 对象 (蓝色节点) 所消耗的内存大小:
“Retained Size” 稍复杂些,它是下图中所有橙色节点的大小:
由于一旦删除红色节点,其余的橙色节点都将无法被访问,这时候它们就会被 GC 回收掉。从这个角度上讲,它们是被红色节点所持有的,因此被命名为 “Retained Size”。
还有一个前面没有提到的数据维度。当您点击某个类名,界面中会显示这个类实例列表,这里有一列新数据 —— “Depth”:
“Depth” 是从 GC Root 到达这个实例的最短路径,图中的这些数字就是每个对象的深度 (Depth):
一个对象离 GC Root 越近,它就越有可能与 GC Root 有多条路径相连,也就越可能在垃圾回收中被保存下来。
以红色节点为例,如果从其左边来的任何一个引用被破坏,红色节点就会变成不可访问的状态并且被垃圾回收回收掉。而对于右边的蓝色节点来说,如果您希望它被垃圾回收,那您需要把左右两边的路径都破坏才行。
值得警惕的是,如果您看到某个实例的 “Depth” 为 1 的话,这意味着它直接被 GC root 引用,同时也意味着它永远不会被自动回收。
下面是一个示例 Activity,它实现了 LocationListener 接口,高亮部分代码 “requestLocationUpdates” 将会使用当前 Activity 实例来注册 locationManager。如果您忘记注销,这个 Activity 就会泄漏。它将永远都待在内存里,因为位置管理器是一个 GC root,而且永远都存在:
您能在 Memory Profiler 中查看这一情况。点击一个实例,Memory Profiler 将会打开一个面板来显示谁正在引用这个实例:
我们可以看到位置管理器中的 mListener 正在引用这个 Activity。您可以更进一步,通过引用面板导航至堆的引用视图,它可以让您验证这条引用链是否是您所预期的,也能帮您理解代码中是否有泄漏以及哪里有泄漏。
CPU Profiler
和 Memory Profiler 类似,CPU Profiler 提供了从另一个角度记录和分析应用关键性能数据的方法。
使用 CPU Profiler,首先要产生一些 CPU 的使用记录:
进入 Android Studio 中的 CPU Profiler 界面,在您的应用已经部署的前提下,点击 “Record” 按钮;
在应用中进行您想要分析的操作;
返回 CPU Profiler,点击 “Stop” 按钮。
由于最终呈现的数据是基于线程组织的,所以去观察数据之前,您应该确认是否选择了正确的线程:
我们这里所获得的 CPU 使用记录信息,其实是一个 System Trace 实例的调用栈集合 (下文统称 “调用栈”)。而就算是很短的 CPU 使用记录,也会包含巨量的信息,同时这些信息也是人无法读懂的。所以 CPU Profiler 提供了一些工具来可视化这些数据。
Call Chart
在 CPU Profiler 界面下半部,有四个标签页,分别对应四个不同的数据图表,它们分别是: Call Chart、Flame Chart、Top Down 和 Bottom Up。其中的 Call Chart 可能是最直白的一个,它基本上就是一个调用栈的重新组织和可视化呈现:
Call Chart 横轴就是时间线,用来展示方法开始与结束的确切时间,纵轴则自上而下展示了方法间调用和被调用的关系。Call Chart 已经比原数据可读性高很多,但它仍然不方便发现那些运行时间很长的代码,这时我们便需要使用 Flame Chart。
Flame Chart
Flame Chart 提供了一个调用栈的聚合信息。与 Call Chart 不同的是,它的横轴显示的是百分比数值。由于忽略了时间线信息,Flame Chart 可以展示每次调用消耗时间占用整个记录时长的百分比。同时纵轴也被对调了,在顶部展示的是被调用者,底部展示的是调用者。此时的图表看起来越往上越窄,就好像火焰一样,因此得名:
Flame Chart 是基于 Call Chart 来重新组织信息的。从 Call Chat 开始,合并相同的调用栈,以耗时由长至短对调用栈进行排序,就获得了 Flame Chart:
对比两种图表不难看出,左边的 Call Chart 有详细的时间信息,可以展示每次调用是何时发生的;右边的 Flame Chart 所展示的聚合信息,则有助于发现一个总耗时很长的调用路径:
Top Down Tree
前面介绍的两种图表,可以帮助我们从两种角度纵览全局。而如果我们需要更精确的时间信息,就需要使用 Top Down Tree。在 CPU Profiler 中,Top Down 选项卡展示的是一个数据表格,为了便于理解其中各组数据的意义,接下来我们会尝试构建一个 Top Down Tree。
构建一个 Top Down Tree 并不复杂。以 Flame Chart 为基础,您只需要从调用者开始,持续添加被调用者作为子节点,直到整个 Flame Chart 被遍历一遍,您就获得了一个 Top Down Tree:
对于每个节点,我们关注三个时间信息:
Self Time —— 运行自己的代码所消耗的时间;
Children Time —— 调用其他方法的时间;
Total Time —— 前面两者时间之和。
有了 Top Down Tree,我们能轻易将这三组信息归纳到一个表格之中:
下面我们来看一看这些时间信息是怎么计算的。左手边是和前面一样的 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 会完成上面所有的计算,您只要理解这些数字是怎么产生的即可:
对比左右两边: Flame Chart 比较便于发现总耗时很长的调用链,而 Top Down Tree 则方便观察其中每一步所消耗的精确时间。作为一个表格,Top Down Tree 也支持按单独维度进行排序,这点同样非常实用。
Bottom Up Tree
当您希望方便地找到某个方法的调用栈时,Bottom Up Tree 就派上用场了。“树” 如其名,Bottom Up Tree 从底部开始构建,这样我们就能通过在节点上不断添加调用者来反向构建出树。由于每个独立节点都可以构建出一棵树,所以这里其实是森林 (Forest):
让我们再做些计算来搞定这些时间信息。
表格有四行,因为我们有四个树在森林中。从节点 C 开始:
Self Time 是 4 + 2 = 6 秒钟;
C 没有调用其他方法,所以 Children Time 是 0;
前面两者相加,总时间为 6 秒钟。
看起来与 Top Bottom Tree 别无二致。接下来展开 C 节点,计算 C 的调用者 B 和 D 的情况。
在计算 B 和 D 节点的相关时间时,情况与前面的 Top Bottom Tree 有所不同:
写在最后
对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。
![
文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!