`
babydeed
  • 浏览: 237996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript内存泄漏 rss文章订阅

    博客分类:
  • Ext
阅读更多

1、什么是闭包、以及闭包所涉及的作用域链这里就不说了。

2、JavaScript垃圾回收机制 

     JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量。

 


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->    var s = [ 12 ,3];
    
var s = null;
    
//这样原始的数组[1 ,2 ,3]就会被释放掉了。

 

3、循环引用

     三个对象 A 、B 、C

     AàBàC :A的某一属性引用着B,同样C也被B的属性引用着。如果将A清除,那么B、C也被释放。

     AàBàCàB :这里增加了C的某一属性引用B对象,如果这是清除A,那么B、C不会被释放,因为B和C之间产生了循环引用。

 


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->    var a = {};
    a.pro 
= { a:100 };
    a.pro.pro 
= { b:100 };
    a 
= null ; 
    
//这种情况下,{a:100}和{b:100}就同时也被释放了。
            
    
var obj = {};
    obj.pro 
= { a : 100 };
    obj.pro.pro 
= { b : 200 };
    
var two = obj.pro.pro;
    obj 
= null;    
    
//这种情况下 {b:200}不会被释放掉,而{a:100}被释放了。

 

4、循环引用和闭包

 


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->    function outer(){
        
var obj = {};
        
function inner(){ 
            
//这里引用了obj对象
        }
        obj.inner 
= inner;
    }

这是一种及其隐蔽的循环引用,。当调用一次outer时,就会在其内部创建obj和inner两个对象,obj的inner属性引用了inner;同样inner也引用了obj,这是因为obj仍然在innerFun的封闭环境中,准确的讲这是由于JavaScript特有的“作用域链”。
因此,闭包非常容易创建循环引用,幸运的是JavaScript能够很好的处理这种循环引用。

5、IE中的内存泄漏

    IE中的内存泄漏有好几种,这里有详细的解释(http://msdn.microsoft.com/en-us/library/bb250448.aspx),园子里也有翻译了(http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html)。

    这里只讨论其中一种,即循环引用所造成的内存泄漏,因为,这是一种最普遍的情况。

    当在DOM元素或一个ActiveX对象与普通JavaScript对象之间存在循环引用时,IE在释放这类变量时存在特殊的困难,最好手动切断循环引用,这个bug在IE 7中已经被修复了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。

   “IE 6 suffered from memory leaks when a circular reference between several objects, among which at least one DOM node, was created. This problem has been solved in IE 7. ”


    如果上面的例子(第4点)中obj引用的不是一个JavaScript Function对象(inner),而是一个ActiveX对象或Dom元素,这样在IE中所形成的循环引用无法得到释放。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->    function init(){
        
var elem = document.getElementByid( 'id' );
        elem.onclick 
= function(){
            alert(
'rain-man');
            
//这里引用了elem元素
        };
    }

Elem引用了它的click事件的监听函数,同样该函数通过其作用域链也引用回了elem元素。这样在IE中即使离开当前页面也不会释放这些循环引用。

6、解决方法

   基本的方法就是手动清除这种循环引用,下面一个十分简单的例子,实际应用时可以自己构建一个addEvent()函数,并且在window的unload事件上对所有事件绑定进行清除。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->    function outer(){
        
var one = document.getElementById( 'one' );
        one.onclick 
= function(){};
    }
    window.onunload 
= function(){
        
var one = document.getElementById( 'one' );
        one.onclick 
= null;
    };

 其它方法(by:Douglas Crockford

 


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
 * 遍历某一元素节点及其所有后代元素
 *
 * @param Elem node  所要清除的元素节点
 * @param function func  进行处理的函数
 * 
 
*/
function walkTheDOM(node, func) {
    func(node); 
    node 
= node.firstChild; 
    
while (node) { 
        walkTheDOM(node, func); 
        node 
= node.nextSibling; 
    } 

/**
 * 清除dom节点的所有引用,防止内存泄露
 *
 * @param Elem node  所要清除的元素节点
 * 
 
*/
function purgeEventHandlers(node) {
    walkTheDOM(node, 
function (e) {
        
for (var n in e) {            
            
if (typeof e[n] === 
                    
'function') {
                e[n] 
= null;
            }
        }
    });

转自:http://04js.cn/content.asp?id=1614


分享到:
评论

相关推荐

    RSS新闻阅读器源码

    7. **安全性**:源码应该考虑用户隐私,避免泄露用户的RSS订阅信息。同时,对输入进行验证,防止XSS(跨站脚本攻击)和SQL注入等安全风险。 8. **可扩展性**:优秀的源码应具备良好的架构,方便添加新功能,如支持...

    RSS阅读器.zip

    【RSS阅读器】是一种在线订阅和获取新闻、博客更新或其他信息源内容的系统。它允许用户在一个集中的界面中查看来自多个来源的信息,无需逐一访问各个网站。在JAVA_WEB项目开发中,创建RSS阅读器涉及到的技术和流程...

    Android手机RSS阅读器html5.zip

    【Android手机RSS阅读器html5.zip】是一款专为Android平台设计的RSS阅读应用,它结合了HTML5技术,提供了一种高效、便捷的方式来获取和阅读RSS订阅源中的内容。这款应用充分利用了HTML5的特性,如离线存储、多媒体...

    rss-episode-filter:开始应用

    【标题】"RSS Episode Filter: 开始应用"指的是一个针对RSS(Really Simple Syndication) feed的筛选工具,可能是一个JavaScript项目,旨在帮助用户过滤和管理RSS订阅中的特定章节或剧集。RSS是一种标准,用于发布...

    网站三大经典模块!!!!!!!

    总结起来,网站开发中的注册与登录、留言版和RSS订阅模块涉及到了用户认证、数据交互、内容管理等多个方面,而ASP.NET和C#提供了强大的工具和框架来支持这些功能的实现。掌握这些核心知识点,不仅能够帮助初学者快速...

    wino-crx插件

    【wino-crx插件】是一款专为英语用户设计的RSS阅读器WebExtension,它主要以Rust编程语言实现,提供了高效、安全的订阅和管理RSS源的能力。WebExtension是一种浏览器扩展技术,允许开发者利用JavaScript、HTML和CSS...

    blog-master.zip

    同时,博主可能还会配置RSS订阅源,允许读者通过RSS阅读器订阅更新。 博客的管理和维护还包括定期备份、版本控制、错误修复以及安全防护。例如,确保不泄露敏感信息,使用HTTPS进行加密传输,以及定期更新依赖库以...

    jsp 博客系统 blog代码

    6. **RSS订阅**:提供RSS feed,让其他平台或用户可以订阅博客更新。 六、安全性与优化 1. **SQL注入防护**:确保所有的数据库查询都使用参数化或ORM框架,避免恶意输入导致的数据泄露。 2. **XSS攻击防御**:对...

    网络基本程序---新闻阅读器

    2. **RSS/Atom订阅**:许多新闻网站提供RSS(简易聚合)或Atom格式的订阅源,新闻阅读器通过解析这些XML文件获取最新的文章标题、摘要和链接。用户可以订阅感兴趣的新闻源,阅读器会自动检查更新并呈现内容。 3. **...

    firefox chrome脚本

    4. **google_chrome_rss_icon.user.js**:这个脚本可能在Chrome浏览器中添加了一个功能,使得用户可以在支持RSS订阅的网站上快速找到并订阅RSS源。 5. **SmoothScroll.user.js**:这类脚本通常用于平滑滚动页面,...

    PageWrangler:一个简单的 Safari 扩展,用于将 FeedWrangler 的单个页面标记为已读

    FeedWrangler 是一款流行且功能丰富的 RSS 订阅服务,它允许用户跟踪并管理他们喜欢的博客、新闻站点和其他在线内容的更新。PageWrangler 的出现是为了弥补 FeedWrangler 在网页版中可能存在的操作不便,通过提供...

    网站访问速度优化提速方法

    - 使用URL重写技术,提供RSS订阅、百度网站地图等服务,有助于提高搜索引擎友好性。 - 对于动态页面,如果条件允许,考虑使用`.ashx`扩展名,因为它们通常比`.aspx`文件加载更快。 - 发布网站时使用Release版本而非...

    微头条全自动发布1.4.zip

    它们能定时获取内容源,如RSS订阅、数据库或者用户指定的文本文件,然后根据预设的时间间隔和规则发布到不同的账号上。 2. **API接口使用**:微头条提供了开发者API,允许第三方应用进行内容发布和用户管理。理解...

    工资查询系统首页

    新闻展示部分可能采用了RSS订阅或者API接口的方式,实时获取并更新新闻内容。这需要后端与外部新闻源进行通信,可能涉及到HTTP请求、JSON解析等技术。新闻数据通常存储在数据库中,以便快速检索和展示。 系统开发中...

    JReader [beta]-crx插件

    与XML格式的RSS或Atom相比,JSON Feed采用JSON(JavaScript Object Notation)作为其数据载体,JSON是一种轻量级的数据交换语言,易于人类阅读和编写,同时也易于机器解析和生成。由于其简洁的语法,JSON Feed在开发...

    podfeeds:用于保存播客源

    播客源通常以RSS(Really Simple Syndication)或Atom格式提供,这些格式可以将新发布的剧集信息推送给订阅者。Podfeeds可能提供了这样的功能,允许用户添加和管理这些源,以便于跟踪更新和新内容。 标签"HTML"表明...

    红色仿今日头条最新资讯阅读程序源码.zip

    4. **API接口**:为了获取和更新实时资讯,程序可能需要对接第三方API,例如RSS订阅服务、新闻聚合API或社交媒体API。 5. **用户体验(UX)和响应式设计**:确保程序在不同设备上(如手机、平板电脑和桌面电脑)都...

    车源宝小程序,发布车源,寻车

    后台可能采用RSS订阅或爬虫技术收集信息,再通过内容管理系统(CMS)进行编辑和发布,同时推送通知至用户端,这涉及到了推送服务如极光推送或信鸽推送。 5. **微信小程序开发**:作为一款微信小程序,其开发遵循...

    web2.0时代的发展与思考[整理].pdf

    RSS(简易信息聚合)让订阅和分享内容变得更加便捷;以及博客、社交媒体、维基百科等用户参与度极高的应用。 2.4 Web 2.0时代的精髓——以人为本 Web 2.0的核心在于用户,它鼓励用户成为内容的创造者和传播者,而...

    cbr-osint-ctf

    6. **信息聚合与监控**:使用工具或编程方法自动化收集和分析大量信息,例如RSS订阅、Twitter流抓取等。 7. **隐私保护与匿名性**:理解如何保护自己的在线隐私,以及识别他人可能的隐私泄露。 8. **法律与道德...

Global site tag (gtag.js) - Google Analytics