jquery.html的垃圾收集

时间:2010-09-02 03:49:25

标签: jquery dom memory

我想知道以下代码是否会导致内存泄漏等问题

<html>
<head>
    <script type='text/javascript' src='jquery-1.4.2.js'> </script>
    <script type="text/javascript">
        function a(){
            for(var i = 0; i < 50000; i++){
                $("#d").html("<span>" + i + "</span>");
            }
        }

    </script>
</head>
<body onload='a();'>
    <div id="d"></div>
</body>

2 个答案:

答案 0 :(得分:3)

在每次迭代中都会创建一个简单的范围。 jQuery中的html()函数运行一个内部cleanData函数,该函数从所有包含的节点中删除关联的数据和事件,但这不是这里的情况。

然后jQuery将innerHTML属性设置为传入的字符串,该字符串释放现有元素。这取决于浏览器的垃圾收集器尽可能地回收内存。这段代码根本没有泄漏。 Chrome实际上在释放内存方面非常快。我看到从2.421MB到748KB的下降主要来自在3秒内发布的跨度元素。

它不会等待页面卸载以释放此内存。这三个快照的间隔时间不到一秒,其中从内存中释放了近26000个HTMLElement个对象。

在打开页面之前

alt text

打开页面后(立即释放了23000个HTMLElement对象,剩余约27000个)

alt text

不到一秒钟之后(除1之外的所有27000个对象都被释放)

alt text

答案 1 :(得分:1)

它将使用内存(可能是兆字节或2的数量级),但它不会泄漏它。

当页面关闭时,应该恢复内存。

我在Firefox的 Dirty 实例上的结果:

                        Memory used (allow several seconds to settle)
                       -----------------------------------------------
Before opening page:        163,332K
Open and page finished:     164,932K  (temporarily spiked to about 210M)
After page closed:          163,668K

请注意,略有差异可能是许多其他标签之一,或者它可能是Firefox着名的内存泄漏,但它可能 JS代码。