使用我的代码防止内存泄漏

时间:2015-02-24 08:55:53

标签: javascript ajax memory-leaks

我正在使用此代码:

<!-- Progress bar holder -->
<div id="progress" style="width:300px; height:20px; border:1px solid #ccc; float: right; margin-top: 7px; margin-right: 7px;"></div>
<!-- Progress information -->
<div id="information" style="width; text-align: center; margin-top: 7px;"></div></div>

在while循环中:

// Javascript for updating the progress bar and information
echo '<script language="javascript">

document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\">&nbsp;</div>";
document.getElementById("information").innerHTML="'.$i.' av '.$no_lines.' rader processade.";
</script>';

// This is for the buffer achieve the minimum size in order to flush data
echo str_repeat(' ',1024*64);

// Send output to browser immediately
flush();
每次while循环执行某事时,$ i将增加+1,这可能非常大。超过300k。目前代码崩溃在~14000(内存使用率超过1gb ram)。它也徘徊在大约30%的CPU使用率,并使上传时的互联网使用非常不愉快

我之前从未使用过javascript,并且我已经阅读了javascript中的内存泄漏,但它并没有帮助我如何防止这种情况。我找到了一些帮助我的链接,但是我不知道如何将它们应用到我的代码中http://javascript.info/tutorial/memory-leaks 例如:empty(),remove(),removeData()。 我也查看了这篇文章:http://www.javascriptkit.com/javatutors/closuresleak/了解发生了什么但是无法弄清楚我做错了什么是有帮助的。 目前我只做代码,如果$ i%100 == 0这是如此糟糕,我甚至不为这个“解决方案”感到自豪。

你们中的任何人都可以帮助我防止代码中的内存泄漏吗?

3 个答案:

答案 0 :(得分:2)

(免责声明:我是Microsoft的软件工程师,负责Internet Explorer Javascript引擎&#34; Chakra&#34;):

您的Javascript代码不包含任何创建新对象的循环,因此不存在泄漏内存的风险,尽管使用innerHTML代替直接DOM操作提供了性能优化的机会(如使用{ {1}}导致文本被解析和处理,这不是便宜的操作,调用innerHTML批次更便宜。

正如我在评论中所写 - 回答问题时,我不建议您使用的方法将进度更新发送给客户。这种方法称为Comet(http://en.wikipedia.org/wiki/Comet_%28programming%29)。但建议替代方法是偏离主题的,你还没有解释有关此代码正在执行的后台操作的任何细节,所以我不会进一步评论。

答案 1 :(得分:0)

您不断向客户端发送脚本块,因此您的标记将永远增长。

实际上,您应该使用AJAX来调用PHP页面(或任何服务器技术)来获取所需的数据。

这种方法也阻止了PHP进程如此繁忙&#34;持续保持HTTP请求存活。

如果你使用了jQuery和AJAX,你只需要一个每X秒调用一次的函数,例如

var myTimer = setInterval(2000, getData);

function getData() {
    $.ajax({
        url: "http://getData.php",
        dataType: json})
        .done(function( data ) { // data is the parsed json
            $("#progress").html(data.percentage);
            $("#information").html(data.information); 
        }
    });   
}

json看起来像

{
    percentage : 80,
    information : "some more info"
}

如果您需要更多&#34;实时&#34;更新,那么你应该使用实现COMET的方法之一。您可以在上面的情况下使用长期持有的HTTP请求,并使用重新请求URL的超时(这对PHP来说不是很好,对其他技术更好)。

答案 2 :(得分:0)

看起来发生了什么,您是否正在向<script>添加越来越多的document个标签。相反,请尝试将此代码放在while

<script language="javascript">
    var progress = document.getElementById('progress'),
        information = document.getElementById('information');

    progress.style.width = $percent;
    information.innerHTML= $i + ' av ' + $no_lines + ' rader processade.';
</script>

查看您的变量和函数名称,它看起来也像PHP,而不是javascript。在这种情况下,您应该使用setTimeout函数而不是while并通过AJAX请求进度更新。