我目前正在开发一个纯 javascript 的网站,并且严重依赖 jQuery 和 jQuery UI 库(这个网站不打算供公众使用,因此渐进增强不是这个项目的严格要求)。我在执行以下代码时遇到了严重的内存泄漏:
oDialogBox = $("<div>...</div>");
/* Add useful things to the dialog box here */
oDialogBox.appendTo("body");
oDialogBox.dialog({
/* Other dialog box settings here */
close: function(event, ui) {
oDialogBox.dialog("destroy");
oDialogBox.remove();
oDialogBox = null;
}
});
在此对话框中的任何给定时间,我都在创建、删除和修改大量 jQuery UI 按钮、多选(根据 Eric Hynds 创建的多选小部件)和单击事件处理程序的实例。根据 jQuery UI 文档,在 oDialogBox 上调用 .remove()应该会导致所有子小部件被解除绑定和删除。然而,我分离的 DOM 树显示了 GC 没有收集的大量垃圾元素。
我很可能错过了大量需要安全完成的关闭。如何执行以下操作:
1) 如何识别哪些闭包使给定的分离 DOM 对象保持活动状态(在 Firefox 或 Chrome 中)?
2) 假设确定了完整的闭包集,除了使变量为空之外,是否需要做任何事情来确保将 DOM 元素标记为垃圾回收?
3)我还注意到我的页面存储的数组列表很大,并且包含对 GC 未收集的 DOM 元素的引用。是否有记录从 javascript 中清除数组并允许将所有元素标记为删除的最佳实践?(注意:这是内存泄漏源的当前主要嫌疑人)