由于摆动一直存在内存泄漏的问题,导致很多开发者不胜困扰,博主在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; }详解颤振引擎那些没被释放的东西