内存泄漏,就是内存不能够被正确地配置,内存不能及时有效回收,他会导致程序执行效率降低甚至执行失败。
在浏览器领域,大部分都可能会出现内存泄漏问题,但是以IE最为多见,也最为严重,尤其是页面中有许多Javascript的交互效果的时候。其中涉及到循环结构(cyclic structure)、DOM对象属性、JavaScript对象属性以及垃圾回收器(garbage collector)。
循环结构(cyclic structure),是指一个DOM对象包含JavaScript对象参数(事件处理函数),JavaScript对象又包含了DOM对象的属性参数。(比如给某个超链接A添加一个onclick事件函数,这时候A就有了相应的事件处理函数,而JavaScript函数对象中也有了A的onclick属性)。
当循环结构(cyclic structure)形成时如果没有别的参数传递给DOM对象或者Javascript函数对象,JavaScript的垃圾回收器(一个自动内存管理器)就会把这两个对象的内存释放并重新进行配置,但是IE的DOM对象属性参数并不能由JavaScript管理清除(不能清除DOM对象的属性参数),而他自己的内存管理机制并不能理解循环结构(cyclic structure)的垃圾回收机制。因此,当循环结构(cyclic structure)的垃圾回收条件形成时,IE也不能进行正确的内存回收管理,导致内存泄漏。当然,这只有在循环结构的未回收内存的数量达到很大的数量级的时候,才会出现明显的内存泄漏症状。
此外,由于循环结构在闭包中出现的几率较大,内存泄漏问题也是不可忽视的。
解决的办法有:
一、避免让可能被移除或改变的DOM对象(remove node/reset innerHTML)中出现循环结构(cyclic structure);
二、在DOM对象被移除前(remove node/reset innerHTML)清空他的属性参数(domNode.Jsfunction = null)
1.避免扩展DOM对象的属性参数,如果有要在适当的时候清空;
2.如果某个事件处理函数在移除后可能被某些DOM对象调用,一定要清空;
3.Ajax中XMLHttpRequest的onreadystatechange事件函数调用之后要清。
4....
以上纯属个人理解,大家自行辨解,同时还望各位高手不吝赐教。
附一个可以清除某个DOM对象及其子孙对象的事件属性的函数
function purge(d) {
var a = d.attributes;//取得DOM对象的所有事件属性
if (a) {
var l = a.length;
for ( var i = 0; i < l; i += 1) {
var n = a[i].name;//取得DOM对象事件属性的名称如onclick、onblur等
if (typeof d[n] === 'function') {
d[n] = null;//清空DOM对象事件属性的值
}
}
}
a = d.childNodes;//处理子元素
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
purge(d.childNodes[i]);
}
}
}
Douglas Crockford: JScript Memory Leaks
http://www.crockford.com/javascript/memory/leak.html
Justin Rogers: Understanding and Solving Internet Explorer Leak Patterns
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp
原文地址:http://hi.baidu.com/webworker/blog/item/25f9f0dcf14d51a2cc116671.html
分享到:
相关推荐
JavaScript内存泄露问题的解析 JavaScript内存泄露问题是一种常见的bug,它会导致系统崩溃和性能下降。内存泄露是指系统不能正确地管理内存分配的情况,这可能会导致程序调用失败、执行减慢等问题。 在JavaScript...
然而,在某些特定情况下,即使对象不再被直接引用,也可能因为其他原因导致内存无法被回收,这就引发了内存泄露问题。 #### 三、循环引用 循环引用是导致内存泄露的一个常见原因。具体来说,如果两个或多个对象...
内存泄漏是程序运行过程中,不再使用的内存没有被正确释放,导致系统资源持续占用,从而影响程序性能甚至系统...了解并掌握这些知识点,开发者可以更有效地预防和解决JavaScript内存泄漏问题,确保应用的高效稳定运行。
在探讨JavaScript内存泄漏的处理方式前,有必要了解内存泄漏的含义。内存泄漏通常指的是程序不再使用的内存未能被释放,导致内存消耗不断上升。即使在高级语言如JavaScript中,这一问题亦可能出现,尽管它拥有垃圾...
JavaScript内存泄漏是一个重要的编程问题,尤其对于Web应用来说,它可能导致性能下降,用户界面响应变慢,甚至在极端情况下导致应用程序崩溃。理解内存泄漏的原因、如何检测和解决它们是每个JavaScript开发者必备的...
“常见兼容问题.doc”可能汇总了各种类型的CSS兼容和JavaScript内存泄漏问题,为开发者提供了一站式参考。而“div+css浏览器兼容问题解决方法(PDF版).pdf”很可能提供了一种系统性的解决策略,包括了从设计到实现的...
sIEve是一款专门针对JavaScript内存泄漏检测的工具,版本为0.0.8。这款工具的主要目标是帮助开发者识别和定位JavaScript应用中的内存泄漏问题,以优化性能并提高用户体验。sIEve通过深入分析JavaScript运行时的内存...
检测内存泄漏的工具和手段确实有限,仅有的两个工具(JavaScript Memory LeakDetector 和 sIEve )都不太好用,不像 Java 里面的一些工具能精准定位。因此,需要通过经验预测最有可能泄漏的几个点,再通过排除法,...
JavaScript内存泄漏是一个重要的主题,尤其是在开发复杂且性能敏感的Web应用程序时。JavaScript是一种动态类型语言,它在浏览器环境中运行,并依赖于垃圾收集机制来管理内存。然而,由于一些特性及浏览器实现的差异...
本文将详细探讨JavaScript内存泄漏的原因,并展示一些常见的内存泄漏模式,以及如何解决这些问题。 首先,JavaScript 是一种垃圾收集语言,意味着对象创建时会分配内存,在没有更多引用时由浏览器回收这些内存。...
在使用Electron结合Vue进行桌面应用开发时,内存泄漏是一个常见且需要重点关注的问题。内存泄漏问题的出现会逐渐消耗系统资源,最终可能导致应用崩溃或运行缓慢。在Electron中,内存泄漏主要跟主进程和渲染进程的...
sIEve是专门用于Internet Explorer的一个工具,它可以帮助开发者定位和修复JavaScript内存泄漏问题。通过运行这个工具,开发者可以获得内存快照,对比不同时间点的内存使用情况,从而找到可能的泄漏源。 总之,理解...
总之,JavaScript内存泄漏是复杂但可管理的问题。理解各种泄漏类型,结合适当的工具进行调试,可以帮助开发者编写出更高效、更稳定的Web应用。在编写JavaScript代码时,应养成良好的编程习惯,如及时解除引用,谨慎...
本文将详细讲解JavaScript中的内存泄露问题和解决方案。 一、什么是内存泄露? 内存泄露是一种错误的编程实践,它会导致程序占用越来越多的内存,直到系统崩溃。JavaScript中的内存泄露通常是由于对象的生命周期不...
IE在早期版本中有一个著名的内存泄露问题,当DOM节点和JavaScript对象通过事件监听器或其他方式相互引用时,即使这些元素从DOM树中移除,由于循环引用的存在,它们的内存不会被释放。解决这个问题的方法是手动解除...
【JavaScript源代码】一篇文章弄懂javascript内存泄漏 在JavaScript中,内存管理对于程序性能至关重要,因为内存泄漏会导致程序效率下降,甚至可能导致应用崩溃。本文旨在深入解析JavaScript中的内存泄漏及其解决...
常见的JavaScript内存泄露类型有: 1. 意外的全局变量:未声明的变量默认成为全局变量,这可能导致意外的内存占用。例如,忘记在函数内部使用`var`关键字会导致变量被附加到全局对象window上,形成持久化的内存占用...
2. **内存泄漏类型**:常见的JavaScript内存泄露包括全局变量、闭包引用、DOM元素引用、事件监听器等。了解这些类型有助于识别潜在问题。 3. **工具使用**:利用如IE Developer Tools(F12工具)、Chrome DevTools...
### 常见的JavaScript内存泄露原因及解决方案 #### 引言 在现代Web开发中,JavaScript已成为构建复杂用户界面的主要编程语言之一。随着应用程序变得越来越庞大与复杂,有效地管理和优化内存成为确保应用性能和用户...