先抛出一个问题和结论
创建多个引擎会对内存造成压力吗?
给出结论:不会
物料
Flutter:1.17.2
JDK:1.8.0_251
对这三个case进行测试
- 单个引擎对内存的影响
- 多个引擎对内存的影响
- 后启动引擎是否会使用先启动引擎开辟的部分内存?
单个引擎对内存的影响
不启动引擎
- app内存占用
109.9M
image.png
启动引擎
-
启动app,启动引擎,此时app内存占用
image.png110.3M
-
进入一个几乎没有视图元素的Activity,然后退出; 此时app内存占用
image.png117.5MB
-
重复2步骤;此时app内存占用
image.png113.8MB
- 重复2步骤;此时app内存占用
114.6MB
image.png
- 结论1:启动一个引擎对内存影响
不大
- 结论2:
启用引擎 + 进入过Activity
对内存的影响是114.6 - 107.6
=7MB
多个引擎对内存的影响
- 两个
cache
引擎
调用
FlutterActivity.withCachedEngine(engineId).build(context)
启动两个cache
引擎,分别
进入一个无大量数据的Activity,然后退出,此时app内存占用131.9M
- 一个
cache
引擎,一个new
引擎
调用
FlutterActivity.withNewEngine(engineId).initialRoute(route).build(context)
启动一个cache
引擎,一个new
引擎(引擎生命周期跟随FlutterActivity),分别进入一个无大量数据的Activity,然后退出,此时app内存占用126.4MB
结论:创建一个cache引擎
要比创建一个new引擎并稍后销毁一个new引擎
多占用起码5.5M内存
后启动引擎是否会使用先启动引擎开辟的部分内存?
测试1:
阶段1:启动一个new引擎 + 进入activity
,并销毁引擎 + 退出Activity
,内存122(启动前) -> 130(销毁后)
阶段2:启动一个new引擎 + 进入activity
,并销毁引擎 + 退出Activity
,内存130 (启动前) -> 132(销毁后)
测试2:
阶段1:启动一个cache引擎,进入activity
,并销毁引擎 + 退出Activity
,内存109(启动前) -> 120(销毁后)
阶段2:启动一个new引擎,进入activity
,并销毁引擎 + 退出Activity
,内存120(启动前) -> 123(销毁后)
结论:
1.会使用
。从测试1和2可以看出,在阶段1经历一次创建、销毁引擎后,会开辟一块高于单个engineVM
的顶级运行时常驻内存,下次创建引擎只会增量开辟2~3MB
内存
2.单个engine
销毁只会销毁和本引擎相关的插件内存、JNI环境、资源;顶层内存并不会释放,而是用于下一次引擎创建
3.所以,在业务中创建多个engine并不会
造成内存压力
网友评论