用我的代码防止内存泄漏
Preventing memory leak with my code
im使用以下代码:
<!-- 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;'"> </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(当时内存使用量超过1gbram)。它的cpu使用率也徘徊在30%左右,在上传时会让互联网使用变得非常不愉快
我以前从未使用过javascript,我读过javascript中的内存泄漏,但它对我如何防止这种情况没有帮助。我找到了一些对我有帮助的链接,但我不知道如何将它们应用到我的代码中http://javascript.info/tutorial/memory-leaks例如:empty()、remove()、removeData()。我还看了这篇帖子:http://www.javascriptkit.com/javatutors/closuresleak/理解正在发生的事情是有帮助的,但不能弄清楚我做错了什么。目前,我只在$i%100==0的情况下编写代码,这太糟糕了,我甚至不为这个"解决方案"感到骄傲。
你们中有谁能帮我防止代码中的内存泄漏吗?
(免责声明:我是微软的软件工程师,在Internet Explorer Javascript引擎"Chakra"上工作):
您的Javascript代码不包含任何创建新对象的循环,因此没有泄漏内存的风险,尽管使用innerHTML
而不是直接的DOM操作提供了性能优化的机会(因为使用innerHTML
会导致文本被解析和处理,这不是一个便宜的操作,所以调用setAttribute("style", "width: ...
会便宜很多
正如我在回复问题的评论中所写的那样,我不建议您使用向客户端发送进度更新的方法。这种方法被称为彗星(http://en.wikipedia.org/wiki/Comet_%28programming%29)。但是,建议其他方法是偏离主题的,而且您还没有解释代码正在执行的后台操作的任何细节,所以我不做进一步的评论。
看起来正在发生的事情是,将越来越多的<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请求进度更新。
您不断地向客户端发送脚本块,因此您的标记将永远增长。
实际上,您可能应该使用AJAX来调用PHP页面(或任何服务器技术),以获得所需的数据。
这种方法还可以防止PHP进程如此"繁忙",从而持续保持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"
}
如果您需要更"实时"的更新,那么您应该使用实现COMET的方法之一。在上面的例子中,您可以只使用一个长期持有的HTTP请求,并有一个重新请求URL的超时(这对PHP来说不太好,对其他技术来说更好)。
- 重复应用 d3 转换导致的内存泄漏
- IE7中的blockUI插件内存泄漏25kb
- Javascript闭包-如何防止内存泄漏
- jQuery Draggable:内存泄漏
- "检测到可能的EventEmitter内存泄漏”;使用Gulp+Watchify+Factor捆绑包
- 在Dojo类中递归调用setTimeout时是否存在内存泄漏
- 是内存泄漏
- 将处理程序留在img.onload上是内存泄漏
- 具有并发sse连接的node.js内存泄漏
- 简单对象的Javascript内存泄漏
- WeakMap是否会将我从父/子关系的内存泄漏中拯救出来
- Javascript绘制画布内存泄漏
- Node.js”;检测到EventEmitter内存泄漏”;
- 正在清理内存泄漏
- 递归Javascript对象是否会导致任何问题(内存泄漏)
- Angular JS$编译服务导致$watch内存泄漏
- 如何防止和防范闭包内存泄漏
- 跟踪 JavaScript 内存泄漏的工具
- 页面刷新后javascript内存泄漏有问题吗?为什么?
- XMLHttpRequest循环内存泄漏