热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JScript内存泄漏/ie内存泄漏

闭包导致了内存泄漏,至少msdn是这么说的。一直以为这是个ie6时代早已经解决的问题,从没特别留意,无意中运行了段代码才发现在ie8时代&

 

闭包导致了内存泄漏,至少msdn是这么说的。一直以为这是个ie6时代早已经解决的问题,从没特别留意,无意中运行了段代码才发现在ie8时代,这个问题还是存在的。找了点资料,了解一下。

所谓的“点资料”主要是两篇文章:

  • http://Javascript.crockford.com/memory/leak.html
  • http://www.blogjava.net/tim-wu/archive/2006/05/29/48729.html

第一篇文章是在表层进行了理解,他的例子很好。第二篇文章更深入更严格,比较抽象。

Javascript内存泄漏

按照第二篇文章提到,内存泄漏的本质就一句话:Javascript权威指南认为,因为使用计数器算法,ie只有遇到循环就注定产生泄漏。后来 eri更正说“ie6处理不了的是jscript与navite object(如dom,active object)之间的ciruclar reference“(在这种情况下才使用计数器算法)。

第一篇译言翻译在这里http://feed.yeeyan.com/articles/view/3407/10103

说得很绕口,但形象了很多:

“ 当一个DOM对象包涵有一个Javascript对象(例如一个事件处理函数)的引用,同时如果这个Javascript对象又包涵该DOM对象,那么这个循环引用就形成了。

这种结构本质上没有问题。[此时,因为该DOM对象和这个事件处理函数并没有别的引用存在,那么垃圾回收器(一种自动的内存资源管理器)本应该把它们都回收点,并内存释放。]Javascript的垃圾回收器能够检测到这种循环引用,并不会对他产生困惑。

但是不幸的是,IE DOM的内存并不能被Jscript所管理。他有他自己的内存管理系统,然而这套系统并不知道循环引用,使得一切都变得混乱。这就导致了,当循环引用形成的时候,内存释放工作不能完成。”

综上内存泄漏准确的说法是:”当碰到Closure,当我们往Native对象(例如Dom对象、ActiveX Object)上绑定事件响应代码时,一个不小心,我们就会制造出Closure Memory Leak。其关键原因,其实和前者是一样的,也是一个跨Javascript object和native object的循环引用。只是代码更为隐蔽,这个隐蔽性,是由于Javascript的语言特性造成的。但在使用类似内嵌函数的时候,内嵌的函数有拥有一个reference指向外部函数的scope,包括外部函数的参数,因此也就很容易造成一个很隐蔽的循环引用,例如: DOM_Node.onevent ->function_object.[ [ scope ] ] ->scope_chain ->Activation_object.nodeRef ->DOM_Node。“

三个例子解读

第一篇文章里的三个例子靠谱解读在这里:

http://www.javaeye.com/topic/172344

暂时我的看法

在什么情况下引起泄漏?

一般都认为是ie6才会有这个问题,但实际上在几个版本的ie里运行下面的代码会发现内存的确在增加。

/*global setTimeout */  
           
(function (limit, delay) {  
               
var queue = new Array(10);  
               
var n = 0;  
 
               
function makeSpan(n) {  
                   
var s = document.createElement('span');  
                    document
.body.appendChild(s);  
                   
var t = document.createTextNode(' ' + n);  
                    s
.appendChild(t);  
                    s
.onclick = function (e) {  
                        s
.style.backgroundColor = 'red';  
                        alert
(n);  
                   
};  
                   
return s;  
               
}  
 
               
function process(n) {  
                    queue
.push(makeSpan(n));  
                   
var s = queue.shift();  
                   
if (s) {  
                        s
.parentNode.removeChild(s);  
                   
}  
               
}  
 
               
function loop() {  
                   
if (n < limit) {  
                        process
(n);  
                        n
&#43;&#61; 1;  
                        setTimeout
(loop, delay);  
                   
}  
               
}  
 
                loop
();  
           
})(10000, 10);  

如何解决这个问题&#xff1a;一句话废话&#xff0c;删除元素之前去除附在上面的函数。&#xff08;咦&#xff0c;这句话怎么这么熟&#xff1f;&#xff09;

第二篇文章给出的解决方式看上去更和谐点。毕竟在js框架中&#xff0c;我们都会看到类似专门的回收器的代码&#xff0c;恐怕是因为对每段程序释放是太废时间的工作。

 



推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
我们每次都聊撸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有