【发布时间】:2009-11-11 04:52:22
【问题描述】:
ASP.NET Ajax 有一个处理模式,它有一个 IDisposable 接口,可以让您释放资源。
- 在jQuery中应该如何释放资源?有没有类似的模式?
- ASP.NET Ajax 库如何/何时调用 dispose 函数?
- 如果页面在一段时间后重新加载,我们是否需要担心内存泄漏?
【问题讨论】:
标签: javascript jquery asp.net-ajax memory-leaks
ASP.NET Ajax 有一个处理模式,它有一个 IDisposable 接口,可以让您释放资源。
【问题讨论】:
标签: javascript jquery asp.net-ajax memory-leaks
在 jQuery 中应该如何释放资源?有没有类似的模式?
jQuery 将处理使用 bind() 附加到 DOM 元素的分离事件处理程序。因此,与开发人员自己负责分离事件处理程序相比,对 DOM 元素的悬空引用应该少得多。然而,它仅在页面卸载时执行此操作(即 window 对象的 unload 事件)。那时它会迭代其事件缓存 (jQuery.cache) 并从元素中移除事件侦听器,以便浏览器推断这些元素不再被引用并回收它们使用的内存。
在 jQuery 中没有 IDisposable 模式。对于您自己的对象,您必须自己管理处置。 $(window).bind('unload', myCleanupFunction) 是一个好的开始。简单地在对象上实现 dispose 方法并在此清理函数中调用它并没有错。
从广义上讲,任何可以/可能具有循环引用的对象属性或全局变量都应特别注意并销毁(delete or null 就足够了)。任何对 DOM 元素的引用都应该被删除或清空。任何围绕 DOM 元素关闭的对 closures 的引用都应该被删除或清空(事件处理程序是这种模式的常见来源)。如果您从 DOM 中删除元素,请使用 remove() 执行此操作,这将自动从您的元素中清除 jQuery 绑定的事件处理程序。
ASP.NET Ajax 库如何/何时调用 dispose 函数?
与 jQuery 一样,ASP.NET AJAX 框架挂钩到 window 对象的 unload 事件以执行一些引用清理。在卸载页面时调用 Sys.Application.dispose 并且 the following occurs:
pageUnload() 函数,则会调用该函数dispose()。unload 事件。ScriptLoader 实例。默认情况下,ASP.NET AJAX 组件、控件和行为在创建组件时自动注册到 Sys.Application 对象(在 Sys.Component 构造函数中)。任何从IDisposable 继承的东西都会在实例化时自动registered with the framework(并放在Sys.Application._disposableObjects 中)。
对于实现IDisposable 的对象,调用实例的dispose() 方法(就像在服务器上一样)。但是,您仍然负责实际释放引用(就像在服务器上一样)。
您做仍然需要注意dispose 方法中对象的delete 或null 属性。此处适用与 jQuery 相同的规则:应特别注意任何可以/可能具有循环引用的对象属性或全局变量,对 DOM 元素的引用应删除或为空,对围绕 DOM 元素关闭的闭包的引用应删除或为空.
然而,与 jQuery 不同,ASP.NET AJAX 不会在页面卸载时自动删除您与Sys.UI.DomEvent.addHandler(又名$addHandler)绑定的侦听器1。你必须小心自己做这件事。然而,该框架确实提供了 Sys.UI.DomEvent.clearHandlers(element)(又名$clearHandlers)来轻松地做到这一点。您可以在 dispose() 实现中调用它,并通过框架传递您已附加事件侦听器的任何元素。
客户端中的IDisposable 更多的是作为放置“卸载”代码的方便位置,并作为代码自行记录的一种方式。我怀疑大多数人在他们的应用程序的生命周期中并没有创建和处置许多对象,而是在页面加载时创建它们一次,并在页面加载时销毁它们一次un。
如果页面在一段时间后重新加载,我们是否需要担心内存泄漏?
我们在分析不经常卸载的 DOM 树中的内存方面付出了很多努力。一般来说,如果页面经常卸载(这包括用户导航到应用程序中的其他页面),您不必太担心。如果它是一个长期存在的应用程序(例如 gmail),您必须非常小心内存泄漏。对于长期存在的应用程序,内存包含不应被视为过早的优化,而是一种非常明显的可能性。诚然,它不会成为性能瓶颈(与 I/O 相比),但在当今的应用程序中,DOM 太过于让浏览器处理它了。然而,这方面的管理是非常棘手的。
1此功能将以autoRemove 参数的形式进入版本 4.0Sys.UI.DomEvent.addHandler
【讨论】: