Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';我的Chrome Profiler为我的对象显示了正确的保留路径,为什么我的对象从未被释放?_Javascript_Debugging_Google Chrome_Memory Leaks_Profiler - Fatal编程技术网

Javascript 为什么';我的Chrome Profiler为我的对象显示了正确的保留路径,为什么我的对象从未被释放?

Javascript 为什么';我的Chrome Profiler为我的对象显示了正确的保留路径,为什么我的对象从未被释放?,javascript,debugging,google-chrome,memory-leaks,profiler,Javascript,Debugging,Google Chrome,Memory Leaks,Profiler,我正在尝试调试我的webapp中的内存泄漏 我拍摄堆的快照并比较不同的堆 我发现我的一些对象在某处被引用。 但是,我的所有对象都是通过看起来在我内部的对象保留的,例如: 如您所见,我创建的几个方法正在引用此SectionNavView对象:cleanUp、hide、isShown等。使用我的局部变量,但这些方法是从我不控制的对象中引用的:idToRappedObject。有时,还有另一个中介-injectedScript对象 如果仅从内部V8引用引用我的对象,那么在探查器在其GC期间拍摄快照之

我正在尝试调试我的webapp中的内存泄漏

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

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

如您所见,我创建的几个方法正在引用此SectionNavView对象:cleanUp、hide、isShown等。使用我的局部变量,但这些方法是从我不控制的对象中引用的:idToRappedObject。有时,还有另一个中介-injectedScript对象


如果仅从内部V8引用引用我的对象,那么在探查器在其GC期间拍摄快照之前是否应该释放它们?

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

您可以通过以下步骤复制它:

  • 打开新选项卡
  • 打开控制台(如果有任何问题,请将其清除)
  • 获取堆快照1
  • 在控制台中键入
    console.log({foo:'bar})
  • 获取堆快照2
  • 清理控制台
  • 获取堆快照3
  • 然后查看结果:

  • 打开快照2和快照1之间的比较视图;您将找到
    {foo:'bar'}
    对象

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


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

    如果它们是从您不控制的对象引用的,它可能具有无法删除的循环引用。如果下面的答案回答了您的问题,即堆栈溢出的工作方式,您将“接受”答案。细节:我甚至没有考虑到控制台的可能性。日志可能对堆快照有任何暗示。我就是为了这个。将重新测试并随时通知您。太棒了,非常感谢你。多亏了你,我才清除了上次的内存泄漏。