【问题标题】:What is InternalNode in chrome heap profilechrome堆配置文件中的InternalNode是什么
【发布时间】:2021-06-22 09:46:14
【问题描述】:

我正在使用 Chrome DevTools 堆快照工具诊断基于 jQuery 的单页应用程序中的内存泄漏,如 https://developer.chrome.com/docs/devtools/memory-problems/#discover_detached_dom_tree_memory_leaks_with_heap_snapshots 中所述

我已经通过这种方式解决了一些问题,但我现在遇到了一个障碍,我无法再确定是什么将对象保留在内存中。例如,对于其中一个对象,它返回以下保持器:

据我所知,该对象被保留是因为它在单击事件的闭包范围内使用。 但是点击事件是在一个分离的 HtmlDivElement 上,它应该被垃圾收集。 它通过 InternalNode 对象以某种方式链接到窗口对象。我在整个互联网上进行了搜索,但我找不到这些 InternalNode 对象是什么。

我的问题是,这些 InternalNode 对象是什么以及如何“释放”它们以便我的对象被垃圾回收。

【问题讨论】:

  • 见源代码中的this comment
  • @wOxxOm 谢谢。我看到有一个预处理器符号可以关闭“InternalNode”名称隐藏。我会尝试是否可以使用该标志构建 chromium 并再次检查堆配置文件。
  • @wOxxOm 我透露了 InternalNode 条目的名称。分离的元素通过 blink::MouseEventManager 保持活动状态。我将不得不深入研究,但这可能是一个铬错误..
  • @wOxxOm 该死。你说得对!单击要分离的元素之外的元素可防止对象泄漏。您能否将其发布为答案,以便我接受?

标签: javascript jquery memory-leaks google-chrome-devtools


【解决方案1】:

TL;DR
泄漏是由https://crbug.com/1177010引起的
单击已分离元素之外的元素可防止发生内存泄漏。


根据@wOxxOm 的评论,我编译了启用enable_additional_blink_object_names 标志的Chromium 版本,以便它显示InternalNode 对象的名称。 看来blink:MouseEventManager 正在阻止分离的 dom 元素被垃圾收集。

这终于把我带到了https://crbug.com/1177010,我可以通过在分离的元素外部单击来确认,然后再拍摄另一个堆快照。

【讨论】:

  • 你们两个真是天才!那些 InternalNode 让我困惑了很久。但我想知道你怎么知道有一个眨眼的标志叫“enable_additional_blink_object_names”?我用谷歌搜索,但找不到任何有用的东西。
  • @fun 我克隆了 chromium 源代码并搜索了字符串“InternalNode”。它需要一点 C 知识。
猜你喜欢
  • 2016-03-19
  • 2012-12-06
  • 2020-12-14
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多