详解颤振引擎那些没被释放的东西

  

由于摆动一直存在内存泄漏的问题,导致很多开发者不胜困扰,博主在0.9.4就开始对其代码内部内存问题在引擎层面修改代码,得到解决,但是对于每个版本都需要跟随官方打包,对于开发者并不是很友好。

  

然而喜出望外的是,在后来的几个版本中,官方内置开发了手动释放内存的方式:smile_cat:

     /* *   *摧毁为发动机运行上下文。   *   *此方法可用于迫使FlutterEngine对象释放所有资源。   *发送此消息后,对象将处于不可用状态,直到收回。   *访问属性或者发送消息或运行时将导致未定义行为   *错误。   */- (void) destroyContext;      

翻译如下:

  

销毁引擎的运行上下文。此方法可用于强制FlutterEngine对象释放所有资源。发送此消息后,对象将处于不可用状态,直到解除分配为止。访问属性或向其发送消息将导致未定义的行为或运行时错误。

  

<代码>但是,<代码>但是,<代码>但是>   

      <李>无法完全释放内存李   <李>偶现崩溃李   
  

偶现崩溃的是什么鬼,暂时没有遇到,不好说。之前博主遇到的崩溃是自己使用方式的问题,在fluttervc关闭之后还有任务在执行methodchannel,即还在调用插件,这个可以在开发上避免。值得注意的是,颤振中使用c++实现,自己对于内存管理并不是很好

  

内存问题自测如下

  

详解颤振引擎那些没被释放的东西

  

确实存在问题,还有将近30米没有被释放,查看一下当前内存对象,如下图

  

详解颤振引擎那些没被释放的东西

  

一个一个看还有那些没有被释放吧

  

<强> android: LruCache

  

最近最少使用近期最少使用算法。内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,颤振引擎会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

  

<强>飞镖:BackgroundComplier对隔离编译优化的类

  

BackgroundCompiler在后台线程中运行优化编译的类。实现:每个隔离一个任务,它与拥有隔离一起消失,后台编译器中没有OSR编译。

  

<强>飞镖::本:套接字

  

vm和开发平台通信的机制,比如jit即时编译的莳萝文件,通过插座传递给dart虚拟机,虚拟机通过rpc加载文件,重置线程,从而实现hotreload热重载

  

<强>飞镖:BoolPrameter

  
      <李>飞镖:EnumParameter李   <李>飞镖:IdParameter李   <李>飞镖:IdParameter李   <李>飞镖:xxxPrameter李   
  

定义在飞镖vm, service.cc中,都继承自MethodParameter,做对应参数校验,参数解析用。编译飞镖文件用的

  

<强>飞镖:OSThread

  

在飞镖运行时负责操作系统线程,创建线程,移除线程,线程查找与管理。如下图

  

详解颤振引擎那些没被释放的东西

  

FlutterEngineRegistrar注册使用关键注册插件的地方,所有插件调用飞镖底层的方法都会通过handlemethodcall回调给使用者,其初始化的地方是引起内存泄漏的地方

        - (instancetype) initWithPlugin:(NSString *) pluginKey flutterEngine: (flutterEngine *) flutterEngine {   自我=(超级init);   NSAssert(自我,@“超级init不能零”);   _pluginKey=pluginKey;//(pluginKey保留);   _flutterEngine=flutterEngine;//(flutterEngine保留);   回归自我;   }      

此处有一篇文章介绍,解决引擎的循环引用文章

  

<强> FlutterStandardMethodCodec标准方法编解码

  

FlutterStringCodec字符串编解码FlutterJsonMessageCodec json编解码

  

不看不知道,一看吓一跳,也竟然是个单例,当然不会被释放了,也能理解,在颤振中用到jsonmssage的地方很多,用不着每次都初始化

  

详解颤振引擎那些没被释放的东西

  

代码实现的地方

        @ implementation FlutterJSONMessageCodec   + (instancetype) sharedInstance {   静态id _sharedInstance=零;   如果(! _sharedInstance) {   _sharedInstance=(FlutterJSONMessageCodec新);   }   返回_sharedInstance;   }

详解颤振引擎那些没被释放的东西