【问题标题】:JavaScript Memory Leak. An object is not removed because of function variableJavaScript 内存泄漏。由于函数变量,未删除对象
【发布时间】:2017-06-17 13:22:01
【问题描述】:

我创建了一个对象this.bookView = new BookView();

当我执行this.bookView=null 时,垃圾收集器没有删除对象。

Google Dev Tool Profile Snapshot Retainers 窗口显示下面的连接(这表明某物引用了该对象)。

context in () 外,所有行均为"Preview is not available"

问题是BookViewaddSheet 函数变量,它还没有在任何地方使用过(还没有),但通过_this 拥有一个对自身的引用。

我尝试了什么:

1) this.bookView.addSheet = null;(没有帮助)

2) delete this.bookView.addSheet;(没有帮助)

我的问题:

1) 如何从 Window 中移除此连接并使bookView 被垃圾回收?

2) 为什么addSheet 变量是从Window 对象链接的?

3) retainers 窗口上的transitionsdescriptors 是什么?

4) 我可以使用哪些其他工具来查找有关这种内存泄漏的更多详细信息。

附: bookView 对象是在 Durandal 页面内创建的。 this.bookView 基本上是 page1.bookView。该页面已正确删除。在deactivate(页面删除)功能期间,我调用this.bookView = null;

【问题讨论】:

  • addSheetAddSheet?
  • 错字,已修复。 addSheet。谢谢
  • 如果您已暂停调试器并且某些相关变量显示在面板或控制台中,则 devtools 调试器本身可能会保留引用。
  • 尝试使用this 而不是_this。无论如何,您应该发布您的代码。见minimal reproducible example

标签: javascript typescript google-chrome-devtools


【解决方案1】:

如果您没有在 function 中实例化 BookView,则 this 将是您的 window 对象,它是全局对象。您已将其全局附加到一个对象,该对象将一直存在,直到您关闭浏览器或选项卡。你可以通过尝试delete window['bookView']来摆脱BookView

编辑:在您的 Durandal 页面停用回调中,运行您的 this 并删除其键。

for(var key in this)
   delete this[key];

【讨论】:

  • 抱歉,没有写这件事—— bookView 是在 Durandal 页面中创建的。 Durandal 页面已正确删除。在页面的停用(页面删除)功能期间,我调用this.bookView = null;。我将编辑原始帖子
  • 当您执行console.log(window.bookView) 时会打印出什么?
  • console.log(window.bookView) 打印 undefined
  • 在您的 Durandal 页面停用回调中,运行您的 this 并删除其键 for(var key in this) delete this[key];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多