避免dojo中的内存泄漏?

Posted

技术标签:

【中文标题】避免dojo中的内存泄漏?【英文标题】:Avoid memory leaks in dojo? 【发布时间】:2011-09-16 14:26:57 【问题描述】:

对于使用 dojo 等工具包在浏览器中长时间运行的应用程序,我一遍又一遍地听到必须避免悬挂引用的观点。但在内存管理方面,每种语言/框架都有自己的特点。

在 dojo 中构建应用程序时如何避免悬空引用?我正在考虑 ios 中“alloc”的规则:如何使用,以及如何在完成后自己清理。

【问题讨论】:

【参考方案1】:

我认为道场最重要的事情是你应该记住断开你连接的任何事件。

这有一个简单的模式,例如在自定义 dijit 中:

//connecting some events
this._events = [
    dojo.connect(...),
    dojo.connect(...)
];

现在,断开连接非常简单:

dojo.forEach(this._events, dojo.disconnect, dojo);

在 dijit 中使用 this.connect 时也适用相同的模式。

【讨论】:

请注意,dijit 小部件在被销毁时会自动清理与widget.connect 相关的任何内容 - 通常,所有小部件在页面卸载时都会被销毁(至少在 IE 中,它在历史上是它所在的位置很重要)。【参考方案2】:

还应该注意的是,即使您遵循this answer 中提到的断开事件处理程序的良好做法,您也可能会遇到麻烦。可能存在垃圾收集器无法检测到的循环引用,或者 Dojo 本身未正确释放的引用。有时您需要对它们显式调用“删除”。以this 为例。

【讨论】:

我认为任何工具集都是如此。但大多数都有一些指导方针,可以帮助解决许多可预防的情况。

以上是关于避免dojo中的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

在使用泄漏节点模块时避免节点 js 中的内存泄漏?

IE8 中 Dojo 1.7.2 导致的内存泄漏

如何避免本机反应中的内存泄漏?

如何防止java中的内存泄漏

如何避免内部类中的内存泄漏

您如何检测/避免(非托管)代码中的内存泄漏? [关闭]