Flutter性能监控工具(1)--- Observatory简介主要讲了如何打开Observatory,现在讲一下如何使用Observatory里的各个功能来分析性能问题,
下图是Observatory的主页面:
最上面的蓝色导航栏
表示当前所在的位置
-
vm@ws://127.0.0.1:50579/ws :表示当前连接的VM
鼠标放在这个上面,会看到这个,表示当前APP的main():
- 右边的Refresh :刷新数据
VM
这里显示当前VM的信息
- name : 当前VM的名字
- version :Dart的版本,APP build的时间,运行在哪个平台上
- embedder :嵌入的平台
- started at :VM启动时的时间戳
- uptime :VM已运行的时长
- refreshed at :上次采样数据的时间
- pid : 进程ID
- peak memory :APP运行时用的峰值内存
- current memory : APP当前用的内存
- native zone memory :native 原生内存
- native heap memory :native 堆内存
- native heap allocatioon count : native 堆对象数量
- flag :一些标记位
- timeline :工具
- 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中使用,有:
- CompileOptimized, CompileScanner, CompileTopLevel, CompileUnoptimized :编译Dart代码
- GCNewSpace : 新生代的垃圾收集
- GCOldSpace : 老生代的垃圾收集
- Idle : 不是VM TAG,但是用来标识Isolate空闲的占比
- Native : 执行Native代码,dart:io库使用的C ++代码 或者 平台相关代码(Platform Channel)
- Runtime : 执行 Runtime 代码
- Dart : 执行 自己的业务Dart 代码
- 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的级别
复制代码
作者:小德_Kurt
链接:https://juejin.im/post/5c4f1c6951882525a72458b6
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。