Flutter性能监控工具(3)--- Observatory使用

9,007 阅读4分钟

Flutter性能监控工具(1)--- Observatory简介 主要讲了如何打开Observatory,现在讲一下如何使用Observatory里的各个功能来分析性能问题,

下图是Observatory的主页面:

最上面的蓝色导航栏

表示当前所在的位置

  1. vm@ws://127.0.0.1:50579/ws :表示当前连接的VM

    鼠标放在这个上面,会看到这个,表示当前APP的main():

  1. 右边的Refresh :刷新数据

VM

这里显示当前VM的信息

  1. name : 当前VM的名字
  2. version :Dart的版本,APP build的时间,运行在哪个平台上
  3. embedder :嵌入的平台
  4. started at :VM启动时的时间戳
  5. uptime :VM已运行的时长
  6. refreshed at :上次采样数据的时间
  7. pid : 进程ID
  8. peak memory :APP运行时用的峰值内存
  9. current memory : APP当前用的内存
  10. native zone memory :native 原生内存
  11. native heap memory :native 堆内存
  12. native heap allocatioon count : native 堆对象数量
  13. flag :一些标记位
  14. timeline :工具
  15. native memory profile :

Isolates

这里是显示APP里的Isolates,每个APP都有一个root Isolates。

Isolates是用一个饼图显示,这个饼图有很多组成部分,我们把这些叫做tags,这些tags用来代表在VM里不同的执行列表,包括User TAG 和 VM TAG:

  • User TAG

    用户自定义的TAG,使用方式如下:

import 'dart:developer';

var customTag = new UserTag('MyTag');

// Save the previous tag when installing the custom tag.
var previousTag = customTag.makeCurrent();

// your code here

// Restore the previous tag.
previousTag.makeCurrent();
  • VM TAG

    VM TAG是系统定义的,在整个UI中使用,有:

    1. CompileOptimized, CompileScanner, CompileTopLevel, CompileUnoptimized :编译Dart代码
    2. GCNewSpace : 新生代的垃圾收集
    3. GCOldSpace : 老生代的垃圾收集
    4. Idle : 不是VM TAG,但是用来标识Isolate空闲的占比
    5. Native : 执行Native代码,dart:io库使用的C ++代码 或者 平台相关代码(Platform Channel)
    6. Runtime : 执行 Runtime 代码
    7. Dart : 执行 自己的业务Dart 代码
    8. VM :创建isolate,和其他未被覆盖的部分

图像的右边还有一系列链接,代表着不同的功能。

debug

可以设置断点并调试您的应用程序。

如何设置debugger,看 dart-lang.github.io/observatory…

class hierarchy

显示应用程序的类层次结构。

cpu profile

显示当前isolate的CPU使用数据

图表的下部按cpu占用比例做了一个列表,反映的是函数的调用次数和执行时间(划重点)。一般排在前面的函数(这些函数是?有待学习)都不是我们写的dart代码。如果你发现自己的某个函数调用占比反常,那么可能存在问题。

具体使用的地址:dart-lang.github.io/observatory…

cpu profile (table)

和cpu profile一样,但是是以表格的形式来展示

allocation profile

显示isolate已分配的内存。通过这个面板你能看到新生代/老生代的内存大小和占比;每个类型所占用的内存大小。

Heap 堆,动态分配的Dart对象所在的内存空间

New generation: 新创建的对象,一般来说对象比较小,生命周期短,如local 变量。在这里GC活动频繁 Old generation:从GC中存活下来的New generation将会提拔到老生代Old generation,它比新生代空间大,更适合大的对象和生命周期长的对象

通过这个面板你能看到新生代/老生代的内存大小和占比;每个类型所占用的内存大小。 为了debug的方便,我们可以获取到某段时间的内存分配情况:点击Reset Accumulator按钮,把数据清零,执行一下要测试的程序,点击刷新。 为了检查内存泄露,我们可以点击GC按钮,手动执行GC。 Accumulator Size:自点击Reset Accumulator以来,累加对象占用内存大小 Accumulator Instances:自点击Reset Accumulator以来,累加实例个数 Current Size:当前对象占用内存大小 Current Instances:当前对象数量

具体使用的地址:dart-lang.github.io/observatory…

heap snapshot

堆快照

heap map

将分配的内存显示为颜色块

heap map 面板能查看old generation中的内存状态 它以颜色显示内存块。 每个内存页面(page of memory)为256 KB,每页由水平黑线分隔。 像素的颜色表示对象的类ID - 例如,蓝色表示字符串,绿色表示双精度表。 可用空间为白色,指令(代码)为紫色。 如果启动垃圾收集(使用“分配配置文件”屏幕中的GC按钮),堆映射中将显示更多空白区域(可用空间)。 将光标悬停在上面时,顶部的状态栏显示有关光标下像素所代表的对象的信息。 显示的信息包括该对象的类型,大小和地址。 当你看到白色区域中有很多分散的其它颜色,说明存在内存碎片化,可能是内存泄露导致的。

具体使用看:dart-lang.github.io/observatory…

metrics

包含您应用中收集的指标。

persistent handles

查看强对象和若对象

ports

端口


啥也没有

logging

设置Log的级别

参考

juejin.cn/post/684490…