6

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

下面的多个快照是显示之前和之后的事件。根据webkit 内存调试文章,快照将显示尚未被 GC 的活动 JavaScript 对象。
采取的一系列行动的快照

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

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

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

快照 2 和快照 10 的比较,所有 base64 字符串仍然保留在那里。 快照 2 和快照 10 的比较

问题:

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

1 回答 1

2

更新

有一篇关于内存调试的新文章发布。本文包括更详细的步骤和过程。

新的内存调试文章

答案

在对应用程序进行了几个月的内存调试之后,我们在调试内存泄漏方面有了一些额外的发现。

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

内存调试步骤

对于那些将来可能还想使用内存调试的人,这里有一些建议。内存调试的当前步骤:

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

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

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

于 2017-07-04T02:53:17.753 回答