使用 Safari Web 检查器调试内存泄漏?

Using Safari web inspector to debug memory leak?

仅供参考,我们正在调试我们的移动混合应用程序,该应用程序是使用 angularJS 1.4.2 和离子框架 1.2.4 以及 WKWebView 开发的。

下面的多张快照是为了展示之前和之后的事件。基于 webkit memory debugging article,快照将显示尚未被 GC 的活动 JavaScript 个对象。

显示页面 A 和控制器 A 的默认状态的快照 2。

快照 5 仍在同一页面中,但经过一些计算并从 PDFTron 生成了一个 base64 字符串 pdf,以便在 UIWebview 上查看它。

快照 10 在退出页面 A 并使用控制器 C 导航到页面 C 后显示。

快照2和快照10的对比,所有的base64字符串都还在。

问题:

  1. snapShot的size不断增加不减少是否正常,是否考虑内存泄漏?
  2. 快照大小仅代表所有活动的 javascript 对象,或者它会显示我们访问过的所有对象,无论它是否活动,就像应用程序中的一些历史对象一样?
  3. 快照大小和实时快照大小有什么不同?
  4. AngularJS 将有助于在导航到下一个控制器时销毁范围,我们还禁用离子缓存。那么这些base64字符串是否也考虑内存泄漏项?

更新

关于内存调试的新文章发布了。本文包含更详细的步骤和过程。

New memory debugging article

答案

经过几个月的应用程序内存调试,我们在调试内存泄漏方面有了一些补充。

  1. 快照的大小会不断增加,因为在页面之间导航时可能会有一些静态对象或变量。
  2. 像上面一样,快照大小表示应用程序的当前活动内存使用情况,包括静态对象、UI 元素和在此控制器中活动的其他组件。
  3. 保留大小和自身大小将不再检查快照大小和实时快照大小,而是提供有关内存使用情况的更多信息。 self size是当前元素的大小,retained size是当前self元素销毁后释放多少内存。
  4. base64 字符串被认为是内存泄漏项。虽然适当的范围销毁和变量清除是在控制器端完成的,但还是有一些泄漏,因为一些附加服务仍然引用这个字符串。清理所有剩余的引用问题后,base64 字符串泄漏现在消失了。

内存调试步骤

这里给以后可能也想使用内存调试的小伙伴提点建议。 当前内存调试步骤:

  1. 从页面 A 导航到页面 B,然后从页面 B 返回到页面 A。
  2. 做一个快照。
  3. 重复第 1 步,再拍一张快照。
  4. 将第一个快照与第二个快照进行比较。
  5. 如果要进行另一次快照比较,请重复步骤 1 至步骤 4。

*记住总是拍摄最新的快照。例如。使用快照5和6而不是1和2,因为较早的快照可能有机会被GC并且结果不准确。

通过这些步骤,最好找出并指出内存泄漏部分。通常我们会跟踪对象、函数和数组的计数。如果有内存泄漏,比较快照时计数的数量会增加。其他一些内存泄漏项将是对象计数中的 $$。这种对象可能会导致内存泄漏,因为该对象不再被使用但仍被应用程序的其他部分引用。