MST

星途 面试题库

面试题:Flutter DevTools内存分析之内存泄漏排查

假设在Flutter应用中发现了内存泄漏问题,阐述如何借助Flutter DevTools的内存分析工具来排查泄漏源。请说明分析过程中重点关注的指标和数据。
34.5万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试
  1. 打开Flutter DevTools内存分析工具
    • 在Flutter应用运行时,通过IDE(如Android Studio或VS Code)的Flutter插件,点击“Open DevTools”,然后选择“Memory”选项卡进入内存分析工具。
  2. 进行内存快照
    • 初始快照:在应用启动且尚未执行任何可能导致内存泄漏的操作前,点击“Take snapshot”获取初始内存快照,记录此时的内存状态。
    • 操作后快照:执行那些疑似会引发内存泄漏的操作(如反复打开关闭页面、创建销毁对象等),再次点击“Take snapshot”获取操作后的内存快照。
  3. 对比内存快照
    • 在内存分析工具中,选择两次快照进行对比。重点关注“Difference”视图,该视图会展示两次快照间内存变化情况。
  4. 重点关注的指标和数据
    • 对象数量变化
      • 如果某个类的实例数量在操作后显著增加且未减少,可能存在该类对象的内存泄漏。例如,一个自定义的Widget类,正常情况下其实例应在页面销毁时被释放,但操作后实例数量持续上升,就需要深入检查。
    • 内存占用变化
      • 查看哪些对象类型占用的内存大幅增长。比如,图片资源相关对象,如果内存中图片占用的内存持续攀升且无合理释放,可能是图片加载或缓存机制存在问题导致内存泄漏。
    • 保留路径(Retained Paths)
      • 对于内存中没有被释放的对象,查看其保留路径。保留路径展示了从根对象到该对象的引用链。如果发现一个本应被释放的对象,其保留路径存在不合理的长链引用(如某个全局单例对象对其有强引用),就找到了可能的内存泄漏原因。例如,一个局部变量对象本应在其作用域结束后被释放,但由于被一个全局单例对象持有引用,导致无法被垃圾回收,通过保留路径就可以发现这种问题。