Flutter 上的内存泄漏监控(1)

文章讲述了如何通过DartVMService监控内存泄漏,涉及ObjRef和Obj的结构,IsolateId和ObjectId的获取方法,以及在Flutter框架中的内存泄漏追踪策略。
摘要由CSDN通过智能技术生成

3、Dart vm_service

Dart VM Service (后面简称 vm_service)是 dart 虚拟机内部提供的一套 web 服务,数据传输协议是 JSON-RPC 2.0。不过我们并不需要要自己去实现数据请求解析,官方已经写好了一个可用的 dart sdk 给我们用 vm_service

ObjRef, Obj 和 id 的作用

先介绍 vm_service 中的核心内容:ObjRef、Obj、id

vm_service 返回的数据主要分为两大类, ObjRef(引用类型) 和 Obj(对象实例类型)。其中 Obj 完整的包含了 ObjRef 的数据,并在其基础上增加了额外信息(ObjRef 只包含了一些基本信息,例如:id,name…)。

基本所有的 api 返回的数据都是 ObjRef,当 ObjRef 里面的信息满足不了你的时候,再调用 getObject(,,,)来获取 Obj。

关于 id: Obj 和 ObjRef 都含有 id,这个 id 是对象实例在 vm_service 里面的一个标识符,vm_service 几乎所有的 api 都需要通过 id 来操作,比如:getInstance(isolateId, classId, ...)getIsolate(isolateId)getObject(isolateId, objectId, ...)

如何使用 vm_service 服务

vm_service 在启动的时候会在本地开启一个 websocket 服务,服务 uri 可以在对应的平台中获得:

  • Android 在 FlutterJNI.getObservatoryUri()
  • iOS 在 FlutterEngine.observatoryUrl

有了 uri 之后我们就可以使用 vm_service 的服务了,官方有一个帮我们写好的 sdk vm_service ,直接使用内部的 vmServiceConnectUri 就可以获得一个可用的 VmService 对象。

vmServiceConnectUri 的参数需要是一个 ws 协议的 uri,默认获取的是 http 协议,需要借助 convertToWebSocketUrl方法转化下

4、泄漏检测实现

有了 vm_service 之后,我们就可以用它来弥补 Expando 的不足了。按照之前的分析,我们要获 Expando 的私有字段 _data, 这里可以使用 getObject(isolateId, objectId) api,它的返回值是 Instance,内部的 fields 字段保存了当前对象的所有属性。这样我们就可以遍历属性获取到 _data,来达到反射的效果。

现在的问题是 api 参数中的 isoateId 和 objectId 是啥,根据我前面介绍的 id 相关内容,它是对象在 vm_serive 中的标识符。也就是我们只有通过 vm_service 才可以获取到这两个参数。

IsolateId 的获取

Isolate(隔离区)是 dart 里面的一个非常重要的概念,基本上一个 isolate 相当于一个线程,但是和我们平常接触的线程不同的是:不同 isolate 之间的内存不共享。

因为有了上述特性,我们在查找对象的时候也要带上

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值