为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?

Posted

技术标签:

【中文标题】为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?【英文标题】:Why doesn't my Chrome Profiler show proper retaining paths for my objects, and why are my objects never released?为什么我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为什么我的对象从未被释放? 【发布时间】:2012-03-19 03:55:46 【问题描述】:

我正在尝试调试我的 web 应用程序中的内存泄漏。

我拍摄堆的快照并比较不同的堆。

我发现我的一些对象在某处被引用。 但是,我的所有对象都通过看起来在我内部的对象保留,例如:

如您所见,这个 SectionNavView 对象被我创建的几个方法引用:cleanUp、hide、isShown 等,使用我的局部变量 that,但这些方法被引用来自我无法控制的东西:idToWrappedObject。有时,还有另一个中介 - injectedScript 对象。

如果我的对象只是从内部 V8 引用中被引用,难道不应该在分析器在其 GC 期间拍摄快照之前释放它们吗?

【问题讨论】:

如果它们被你无法控制的东西引用,它可能有你无法删除的循环引用。 如果下面的答案回答了您的问题,Stack Overflow 的工作方式,您会“接受”这个答案。详情:***.com/help/someone-answers 【参考方案1】:

这仅仅意味着您使用了console.log。因此,VM 会保留对您的对象的引用,以便您稍后检查它们。您可以停止使用控制台,也可以在每次拍摄堆快照时将其清除。

您可以通过以下步骤重现它:

    打开新标签 打开控制台(如果有的话,清除它) 获取堆快照 1 在控制台中输入console.log( foo:'bar' ) 获取堆快照 2 清除控制台 获取堆快照 3

然后查看结果:

    打开快照2和快照1的比较视图;你会找到 foo: 'bar' 对象

    打开快照3和快照2的比较视图;你会发现同一个对象现在显示的增量为 -1,这意味着它在你清除控制台后被垃圾收集

最后,您可能还会在 _idToWrappedObjectInjectedScript 旁边的保留树路径中看到“全局句柄”和“GC 根”。我不确定这如何适用于 GC 根的定义,但清除控制台确实允许垃圾收集。

【讨论】:

我什至没有考虑 console.log 可能对堆快照有任何影响的可能性。为此+1。将重新测试并随时通知您。太棒了。 非常感谢。我刚刚清除了我认为感谢你的最后一次内存泄漏。

以上是关于为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?的主要内容,如果未能解决你的问题,请参考以下文章

为啥chrome浏览器经常更换端点

解释 NVIDIA Visual Profiler 输出

为啥 Chrome 没有收到我的 cookie?

为啥当我没有为我的 openGLWidget 创建额外的类时 glRotate 只工作一次?

为啥我的 YouTube 链接没有在 Chrome 的 iframe 中自动播放? [复制]

我正在为我的 ASP.NET MVC 程序使用 DataTables 插件。该表显示没有任何 CSS。为啥?