热门标签 | 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;恐怕是因为对每段程序释放是太废时间的工作。

 



推荐阅读
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
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社区 版权所有