使用 Safari Web 检查器调试内存泄漏?
Posted
技术标签:
【中文标题】使用 Safari Web 检查器调试内存泄漏?【英文标题】:Using Safari web inspector to debug memory leak? 【发布时间】:2017-03-02 04:03:48 【问题描述】:仅供参考,我们正在调试我们的移动混合应用程序,该应用程序是使用 angularJS 1.4.2 和带有 WKWebView 的 ionic 框架 1.2.4 开发的。
下面的多张快照是为了展示之前和之后的事件。基于webkit memory debugging article,快照将显示尚未被GC的活动javascript对象。
快照 2 显示页面 A 和控制器 A 的默认状态。
快照 5 仍在同一页面中,但经过一些计算并从 PDFTron 生成 base64 字符串 pdf 以在 UIWebview 上查看。
在退出页面 A 并使用控制器 C 导航到页面 C 后显示的快照 10。
快照 2 和快照 10 的比较,所有 base64 字符串仍然保留在那里。
问题:
-
snapShot 大小不断增加不减少是否正常,是否考虑内存泄漏?
快照大小仅代表所有活动的 javascript 对象,或者它将显示我们访问过的所有对象,无论它是否是活动的,就像应用中的一些历史对象一样?
快照大小和快照实时大小有什么区别?
AngularJS 将有助于在导航到下一个控制器时破坏作用域,我们还禁用了 ionic 上的缓存。那么这些base64字符串是否也考虑了内存泄漏项?
【问题讨论】:
【参考方案1】:更新
有一篇关于内存调试的新文章发布。本文包括更详细的步骤和过程。
New memory debugging article
答案
在对应用程序进行了几个月的内存调试之后,我们在调试内存泄漏方面有了一些额外的发现。
-
快照的大小会不断增加,因为在页面之间导航时可能会有一些静态对象或变量。
与上面一样,快照大小表示应用的当前活动内存使用情况,包括在此控制器中处于活动状态的静态对象、UI 元素和其他组件。
不是检查快照大小和快照实时大小,保留大小和自身大小将获得有关内存使用情况的更多信息。 self size 是当前元素的大小,retained size 是当前 self 元素销毁后将释放多少内存。
base64 字符串被认为是内存泄漏项。虽然在控制器端完成了适当的范围销毁和变量清除,但是由于一些添加服务仍然引用该字符串,因此存在一些泄漏。清理完所有剩余的引用问题后,base64 字符串泄漏现在消失了。
内存调试步骤
这里对那些将来可能还想使用内存调试的人提出一些建议。 内存调试的当前步骤:
-
从页面 A 导航到页面 B,然后从页面 B 返回页面 A。
做快照。
重复第 1 步并制作另一个快照。
比较第一个快照和第二个快照。
如果要进行另一个快照比较,请重复步骤 1 到步骤 4。
*请记住始终拍摄最新的快照。例如。使用快照 5 和 6 而不是 1 和 2,因为较早的快照可能有机会成为 GC,结果将不准确。
通过这些步骤,最好找出并确定内存泄漏部分。通常我们会跟踪对象、函数和数组计数。如果有内存泄漏,比较快照时计数会增加。其他一些内存泄漏项将是对象计数中的 $$。这种对象可能会导致内存泄漏,因为该对象不再使用但仍被应用程序的其他部分引用。
【讨论】:
以上是关于使用 Safari Web 检查器调试内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章