内存泄漏的可能性有多大?

时间:2011-03-21 20:20:45

标签: javascript jquery browser

想象一下,我使用jQuery / AJAX构建了一个复杂的界面,并希望这个界面的应用程序在一整天内都能打开。它大量处理AJAX,构建其元素,删除其他元素,更改位置和大小等。这种情况下内存泄漏或浏览器滞后的可能性有多大?如何更好地处理数据和代码以避免过度使用内存?我可以面对浏览器方面的任何问题吗?

4 个答案:

答案 0 :(得分:5)

jQuery本身可以很好地清理事件后绑定的项目等等。但是,通过销毁jQuery之外的对象,它仍然很容易泄漏事件等。例如:

$('#someDiv a').bind('click', function(){ ... });
$('#someDiv').html('foo');

上面的代码消除了div中的链接,但由于jQuery不知道它,它不会从事件的内部数据存储中释放函数,并且函数泄漏。

您也可以轻易泄漏任何现有的泄漏模式,其中有许多:循环引用等。其中许多都是由封闭引起的。

谷歌“javascript泄漏模式”的信息。

答案 1 :(得分:0)

您可以通过简单地创建超出完成任务所需的对象来处理过度使用内存。

但是,jQuery不应该受到内存泄漏的影响,除非在浏览器中有。但

答案 2 :(得分:0)

这将取决于浏览器。 jQuery没有引入我所知道的任何内存泄漏,但我知道在某些浏览器中,闭包会导致泄漏。我的意思是你应该担心内存泄漏,但可能不是来自jQuery。

防止内存泄漏可能非常困难,尤其是当应用程序在可变环境中运行时。在不同的浏览器上长时间运行您的应用程序,并跟踪每个浏览器的内存使用情况 - 这样您就可以确定泄漏的内存量,如果遇到问题,可以尝试修复它。

一般来说,您应该像处理优化一样对待泄漏。那就是:让它工作,然后快点=>让它发挥作用,然后让它变亮。

希望这会有所帮助:)

答案 3 :(得分:0)

jQuery对内存泄漏非常小心,例如:
(我正在显示1.3.2的代码片段,我希望以后的版本会同样谨慎) 当您使用''将节点的innerHTML设置为.html('')时,会发生以下情况

/**** jQuery's html method ****/
html: function( value ) {
    return value === undefined ?
        (this[0] ?
            this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
            null) :
        /**** This bit will call empty on the node ****/
        this.empty().append( value );
},

/**** jQuery's empty method ****/
empty: function() {
    /**** this bit removes all dom nodes that are children ****/
    // Remove element nodes and prevent memory leaks
    jQuery(this).children().remove();

    /**** this bit just gets rid of text nodes ****/
    // Remove any remaining nodes
    while ( this.firstChild )
        this.removeChild( this.firstChild );
}

/**** jQuery's remove method ****/
remove: function( selector ) {
    if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
        // Prevent memory leaks
        jQuery( "*", this ).add([this]).each(function(){

            /**** This is the important bit, all events and all data  ****/
            /**** including references to other objects and nodes are removed  ****/
            /**** Sweet! ****/
            jQuery.event.remove(this);
            jQuery.removeData(this);
        });
        if (this.parentNode)
            this.parentNode.removeChild( this );
        }
}, 

我非常有信心jQuery可以很好地防止内存泄漏。当然,如果你使用innerHTML删除内容,你将失去这个好处。这并不是说你不应该这样做,它更有效率,但你要么不需要关心可能的泄漏,要么确信子节点没有附加事件或数据。