在IE下的JS编程中,以下的编程方式都会造成即使关闭IE也无法释放内存的问题,下面分类给出:
1、给DOM对象添加的属性是一个对象的引用。范例:
var MyObject = {};
document.getElementById('myDiv').myProp = MyObject;
解决方法:
在window.onunload事件中写上: document.getElementById('myDiv').myProp = null;
2、DOM对象与JS对象相互引用。范例:
function Encapsulator(element) {
this.elementReference = element;
element.myProp = this;
}
new Encapsulator(document.getElementById('myDiv'));
解决方法:
在onunload事件中写上: document.getElementById('myDiv').myProp = null;
3、给DOM对象用attachEvent绑定事件。范例:
function doClick() {}
element.attachEvent("onclick", doClick);
解决方法:
在onunload事件中写上: element.detachEvent('onclick', doClick);
4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
document.body.appendChild(parentDiv);
parentDiv.appendChild(childDiv);
解决方法:
从内到外执行appendChild:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
parentDiv.appendChild(childDiv);
document.body.appendChild(parentDiv);
5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例:
for(i = 0; i < 5000; i++) {
hostElement.text = "asdfasdfasdf";
}
这种方式相当于定义了5000个属性!
解决方法:
其实没什么解决方法:P~~~就是编程的时候尽量避免出现这种情况咯~~
说明:
1、以上资料均来源于微软官方的MSDN站点,链接地址:
http://msdn.microsoft.com/librar ... e_leak_patterns.asp
大家可以到上面这个地址中看到详细的说明,包括范例和图例都有。只是我英文不太好,看不太懂,如果我上述有失误或有需要补充的地方请大家指出。
2、对于第一条,事实上包括 element.onclick = funcRef 这种写法也算在其中,因为这也是一个对对象的引用。在页面onunload时应该释放掉。
3、对于第三条,在MSDN的英文说明中好像是说即使调用detachEvent也无法释放内存,因为在attachEvent的时候就已经造成内存“LEAK”了,不过detachEvent后情况还是会好一点。不知道是不是这样,请英文好的亲能够指出。
4、在实际编程中,这些内存问题的实际影响并不大,尤其是给客户使用时,客户对此绝不会有察觉,然而这些问题对于程序员来说却始终是个心病 --- 有这样的BUG心里总会觉得不舒服吧?能解决则给与解决,这样是最好的。事实上我在webfx.eae.net这样顶级的JS源码站点中,在它们的源码里都会看到采用上述解决方式进行内存的释放管理。
研究 jsvm 的时候,发现 js.lang.System 里面定义了 gc() 方法
System.gc = function ()
{
if (System.isIeBrowser())
{
CollectGarbage();
setTimeout("CollectGarbage();", 1);
}
}
CollectGarbage() 是ie特有的一个释放内存函数
分享到:
相关推荐
IE浏览器中的JavaScript编程需要注意内存释放的问题,因为不当的编程习惯会导致即使关闭浏览器,内存也得不到释放。这主要体现在以下几个方面: 1. 对DOM对象添加的属性是对象引用时,该属性引用的对象不会被垃圾...
标题"测试JavaScript在IE中的内存泄露"表明我们将讨论如何检测和分析JavaScript在IE浏览器中的内存泄露问题。在IE中,由于其JavaScript引擎(JScript)的一些特性,如活动对象模型(ActiveXObject)和遗留的COM组件...
在IE浏览器中,由于其JavaScript引擎的设计缺陷和与其他组件的交互方式,内存泄漏问题尤为突出。 **内存泄漏的原因** 1. **全局变量和闭包**:JavaScript中,全局变量和闭合函数会持续引用内存,导致对象无法被...
内存泄漏是编程中的一个常见问题,尤其是在JavaScript环境中,由于IE浏览器的内存管理机制,这个问题显得尤为突出。Drip作为一个实用的工具,帮助开发者定位和解决这一问题,提高Web应用程序的性能和稳定性。 在...
在描述中提到,“一款非常专业的用于检测写的JS代码是否有内存泄露现象”,这说明该工具旨在帮助开发者识别和解决JavaScript代码中的内存泄漏问题。JavaScript中的内存泄漏通常由于未正确释放不再使用的对象、全局...
JavaScript内存泄漏是一个重要的主题,尤其是在开发复杂且性能敏感的Web应用程序时。JavaScript是一种动态类型语言,它在浏览器环境中运行,并依赖于垃圾收集机制来管理内存。然而,由于一些特性及浏览器实现的差异...
JavaScript是一种广泛使用的高级编程语言,它在Web开发中扮演着重要角色,特别是在浏览器端的动态交互中。然而,随着JavaScript应用的复杂性和对内存的需求增加,内存管理成为了前端开发人员必须面对的问题之一。...
综上所述,这个话题涉及到JavaScript编程、浏览器内存管理、IE9的兼容性问题以及如何通过测试和分析来定位并解决内存泄漏问题。对于Web开发者来说,理解这些问题并掌握相应的调试技巧是非常重要的,特别是对于需要...
在JavaScript编程中,内存泄露指的是在浏览器中不再使用的变量或对象占用的内存没有被及时回收,导致可用内存逐渐减少的现象。这种现象通常发生在循环引用、闭包等复杂场景中。 #### 二、JavaScript垃圾回收机制 ...
IE在早期版本中有一个著名的内存泄露问题,当DOM节点和JavaScript对象通过事件监听器或其他方式相互引用时,即使这些元素从DOM树中移除,由于循环引用的存在,它们的内存不会被释放。解决这个问题的方法是手动解除...
JavaScript在IE9之前的版本中,内存管理机制与现代浏览器有所不同,导致了一些特有的内存泄露问题。在IE9之前,JavaScript引擎JScript使用了两种不同的垃圾回收策略:对于JScript对象使用了"标记-清除"算法,而对于...
标题“IE内存泄露”指的是在使用Internet Explorer浏览器时,由于程序设计或实现的缺陷,导致内存资源无法正确释放,从而持续占用系统内存,随着时间推移可能导致系统性能下降甚至崩溃的问题。这种现象在早期版本的...
内存泄漏是计算机编程中一个严重的问题,特别是在长时间运行的应用程序如Web浏览器中。"ext2.2的内存泄漏补丁"针对的就是这个问题,它是一个专为解决EXT2.2框架中内存泄漏问题而设计的更新。 EXT是一个流行的...
3. **JavaScript问题**:不恰当的JavaScript编程,如无限制的循环、阻塞主线程的操作、未优化的定时器等,都可能导致浏览器假死。 4. **重绘与回流**:频繁修改样式属性,尤其是触发浏览器进行重绘或回流的操作,会...
JavaScript内存泄漏是一个重要的主题,尤其是在现代Web开发中,因为页面长时间保持...在编写JavaScript代码时,应养成良好的编程习惯,如及时解除引用,谨慎使用闭包,以及正确处理跨页面引用,以减少内存泄漏的风险。
内存泄露是计算机程序设计中的一个严重问题,尤其在资源有限的环境中,如移动设备或服务器。内存泄露是指程序在分配了内存后,由于某种原因未能正确释放,导致这部分内存持续占用,随着时间推移,可能会耗尽系统可用...
标题 "jquery 内存泄露bug" 指的是在使用jQuery库进行JavaScript编程时可能出现的一种常见问题,即内存无法正常释放,导致应用占用过多内存,影响性能甚至可能导致浏览器崩溃。这个问题通常与对象引用、事件监听器和...
**描述:**在JavaScript(js)开发过程中,DOM(文档对象模型)操作是常见的任务,但不幸的是,在Internet Explorer(IE)浏览器中,不恰当的DOM操作可能导致内存泄漏问题。sIEve-0.0.8是一款专门针对这一问题的工具...
闭包和内存泄漏是JavaScript编程中的两个重要概念,它们对程序性能和资源管理有直接影响。 首先,闭包是指一个函数能够访问并操作其自身作用域内的变量,即使这个函数在其外部被调用。在JavaScript中,每当内部函数...