面试题答案
一键面试具体操作步骤
- 启动应用并连接DevTools:
- 在Flutter项目中,运行应用程序,可以使用
flutter run
命令启动应用。 - 启动完成后,打开浏览器,访问
http://localhost:9100
(默认端口,若被占用会有提示新端口),打开Flutter DevTools。
- 在Flutter项目中,运行应用程序,可以使用
- 开始内存分析:
- 在DevTools界面中,找到并点击“Memory”选项卡进入内存分析页面。
- 点击“Start profiling”按钮开始记录内存数据。此时,应用在运行过程中的内存变化情况就会被记录下来。
- 执行可能导致内存泄漏的操作:
- 在应用中进行一些重复性操作,例如反复打开和关闭页面、创建和销毁对象等,这些操作有可能触发内存泄漏。
- 停止记录并分析数据:
- 完成可能导致内存泄漏的操作后,点击“Stop profiling”按钮停止记录内存数据。
- 在内存分析界面,可以查看内存快照,其中包括堆内存大小、对象数量等信息。重点关注“Allocations”(分配情况)图表,观察随着操作进行内存分配是否持续增长而没有相应的释放。同时,查看“Object Count”(对象数量)图表,若某些对象数量持续增加且没有减少,也可能暗示内存泄漏。
- 可以使用“Compare snapshots”功能,通过对比不同时间点的内存快照,更清晰地看到哪些对象在持续增加,从而定位可能发生内存泄漏的对象类型。
判断内存泄漏的依据
- 内存持续增长:在反复执行特定操作后,观察到堆内存大小持续上升,没有回落的趋势。即使应用进入相对静止状态(没有新的正常对象创建操作),内存仍然居高不下,这表明内存没有得到有效的释放,很可能存在内存泄漏。
- 对象数量异常增加:特定类型的对象数量随着操作不断增加,并且在操作结束后对象数量没有减少,这些对象很可能没有被正确地回收,是内存泄漏的迹象。
- 对象引用关系异常:通过分析对象的引用关系,如果发现某些对象被不合理地长期持有引用,导致垃圾回收器无法回收它们,也可判断存在内存泄漏。例如,一个本应在页面关闭时被销毁的对象,由于被全局对象或静态变量持有引用,一直存活在内存中。