当前位置: 现金游戏网站现,澳门威尼斯游戏网站,欢乐水果游戏下载 > 资源中心 > 操纵 Android Studio Profiler 工具解析行使的内存和 CPU 操纵数据

操纵 Android Studio Profiler 工具解析行使的内存和 CPU 操纵数据

原标题:操纵 Android Studio Profiler 工具解析行使的内存和 CPU 操纵数据

为了协助开发者开发出更添轻快高效的行使,吾们在 Android Studio 3.0 以及更高版本中添入了 Android Profiler 工具,用于行使的 CPU、内存、网络和能耗分析。

在 Android Profiler 挑供的这四栽性能数据中,绝大无数场景下吾们都更关心 CPU 和内存的操纵情况。本文将介绍对答的两栽分析工具 —— Memory Profiler 和 CPU Profiler。

Memory Profiler

很众开发者操纵 Memory Profiler,是期待发现和定位内存泄露题目。在介绍 Memory Profile 如何解决这一题目之前,吾想先清晰 "内存泄露" 这一切念。不论您现在是否晓畅内存泄露,都将协助吾更益地注释 Memory Profile 的做事原理。

内存泄露

什么是内存泄露?

清淡吾们认为,在运走的程序中,倘若一个无法访问的对象却照样占用着内存空间,即为此对象造成了内存泄露。倘若您操纵过 C 说话或 C 的指针,您会很熟识这个概念。

但是在 Kotlin 和 Java 的世界中,事情有些许迥异。由于这两栽说话是运走在 Java 虚拟机 (JVM) 中的。在 JVM 中,有个主要的概念,就是垃圾回收 (GC)。当垃圾回收运走时,虚拟机会最先识别 GC Root。GC Root 是一个能够从堆外部访问的对象,它能够是本地变量或运走中的线程等。虚拟机会识别一切能够从 GC Root 访问的对象,它们将会被保留。而其他无法从 GC root 访问的对象,则会被认为是垃圾并回收失踪。

睁开全文

于是,清淡意义上的内存泄露在 JVM 中并不存在。在 JVM 中的内存泄露清淡是指: 内存中含有那些再也不会被操纵、但是照样能够访问的对象。

Activity 和 Fragment 泄露检测

在 Android 行使中, 答当尤为警惕 Activity 和 Fragment 对象的泄露,由于这两栽对象清淡都会占用很众内存。在 Android 3.6 中,Memory Profiler 添入了自动检查 Activity 和 Fragment 中的内存泄露的功能。操纵这一功能专门的浅易:

最先,您必要在 Memory Profiler 中保存 Heap Dump,点击下图所示按钮:

最先,您必要在 Memory Profiler 中保存 Heap Dump,点击下图所示按钮:

在 Heap Dump 添载完善后,勾选 "Activity/Fragment Leaks" 选框:

在 Heap Dump 添载完善后,勾选 "Activity/Fragment Leaks" 选框:

此时倘若有检查到 Activity 或 Fragment 的泄露,就会在界面中表现出来。

Memory Profiler 议决以下几栽场景来判定泄露是否发生:

当吾们烧毁了一个 Activity 的实例后,这个实例就再也不会被操纵了。此时倘若照样有这个 Activity 的引用,Memory Profiler 就会认为它已经泄露; Fragment 的实例答当与一个 Fragment Manager 相相关,倘若吾们望到一个 Fragment 异国相关任何一个 Fragment Manager,而且它照样被引用时,也能够认为有泄露发生。

不过要仔细的是,针对 Fragment 有个稀奇的情况: 倘若您载入的 Heap Dump 的时机,刚益介于 Fragment 被创建和被操纵的时间之间,就会造成 Memory Profiler 误报;雷怜悯况也会发生在 Fragment 被缓存但是异国被复用的时候。

其他内存泄露检测

当您拿到一段 Heap Dump 之后,Memory Profiler 会展现出类的列外。对于每个类,"Allocation" 这一列表现的是它的实例数目。而在它右边则挨次是 "Native Size"、"Shallow Size" 和 "Retained Size":

这几组数据别离意味着什么呢?下面吾会议决一个例子来表明。

吾们用下图来外示某段 Heap Dump 记录的行使内存状态。仔细红色的节点,在这个示例中,这个节点所代外的对象从吾们的工程中引用了 Native 对象:

这栽情况不太常见,但在 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 以此类推...

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 有所迥异:

由于吾们在构建基于 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 永世都是前两者之和。下面便是整个外格睁开的样子:

当您想要不都雅察某个手段如何被调用,比如这个 nanoTime 手段时,您能够操纵 Bottom Up Tree 并不都雅察 nanoTime 手段的子节点列外,议决右边的时间数据,您能够找到谁人您所感有趣的调用:

备忘外

前线介绍了四栽迥异的数据图外,并且还详细注释了一些数据是如何被计算出来的。倘若您觉得头绪太众很难记住,能够,下面这个简明的备忘外就是为您准备的:

总结

本文介绍了 Android Studio Profiler 中的两栽数据分析工具。

其中 Memory Profiler 能够自动检测 Activity 和 Fragment 的内存泄露,而议决晓畅和操纵 Memory Profiler 中数据分析功能挑供的数据,也能够发现息争决其他类型的内存泄露题目。

相关 CPU Profiler 则介绍了 Call Chart、Flame Chart、Top Down、Bottom Up 这四栽维度的数据表现。

期待这些内容能够协助您更添晓畅 Android Profiler。如仍有疑问,迎接在下方留言。也迎接议决 Android Studio 逆馈操纵中遇到的题目。

您也能够议决视频回顾 2019 Android 开发者峰会演讲 —— 读懂 Android Studio 分析工具数据: