IE、FF、GoogleChrome中的内存泄漏递归javascript函数 首字母 var-cnt=0; setTimeout(“addCounter()”,100); addCounter=函数(){ ++碳纳米管; 如果(cnt>1000000)cnt=0; document.getElementById('t').firstChild.nodeValue='Counter:#'+(cnt); setTimeout(“addCounter()”,100); }

IE、FF、GoogleChrome中的内存泄漏递归javascript函数 首字母 var-cnt=0; setTimeout(“addCounter()”,100); addCounter=函数(){ ++碳纳米管; 如果(cnt>1000000)cnt=0; document.getElementById('t').firstChild.nodeValue='Counter:#'+(cnt); setTimeout(“addCounter()”,100); },javascript,memory-leaks,Javascript,Memory Leaks,当我在Internet Explorer/Firefox/Chrome中运行此示例代码时,内存使用会增加,直到浏览器/操作系统内存耗尽,浏览器崩溃 有谁能帮我重写不占用内存的代码?或者我把它作为一个bug报告给浏览器开发者?删除setTimeout(“addCounter()”,100)来自函数体这似乎可以阻止失控的内存使用: <html> <body> <h1 id="t">Initial</h1>

当我在Internet Explorer/Firefox/Chrome中运行此示例代码时,内存使用会增加,直到浏览器/操作系统内存耗尽,浏览器崩溃


有谁能帮我重写不占用内存的代码?或者我把它作为一个bug报告给浏览器开发者?

删除
setTimeout(“addCounter()”,100)来自函数体

这似乎可以阻止失控的内存使用:

<html>
    <body>
        <h1 id="t">Initial</h1>
            <script>
                var cnt=0;
                setTimeout("addCounter()",100);
                addCounter=function(){
                    ++cnt;
                    if (cnt>1000000) cnt=0;
                    document.getElementById('t').firstChild.nodeValue='Counter: #'+(cnt);
                    setTimeout("addCounter()",100);
                }
            </script>
    </body>
</html>

首字母
var-cnt=0;
设置超时(addCounter,100);
addCounter=函数(){
++碳纳米管;
如果(cnt>1000000)cnt=0;
document.getElementById('t').firstChild.nodeValue='Counter:#'+(cnt);
设置超时(addCounter,100);
}

不要将
setTimeout
与字符串一起使用。由于许多原因,这是一种不好的做法,而且显然会增加内存使用量(免责声明:我不是
setTimeout
方面的专家)。

我认为浏览器必须有类似内存管理器和更好的系统,并检查每个进程是否存在内存泄漏,如果每个脚本泄漏任何内存,浏览器必须杀死脚本或警报,然后杀死它

  • 等等

ps:这个脚本可以用作xss代码:D

在我增加了测试机器的内存后,我发现在一段时间之后,内存使用率没有再增加!垃圾收集器(或任何负责真正空闲未使用内存的东西)似乎没有针对低内存系统进行优化(比如我在第一次测试中使用的那一个)
事实上,花了大约5000万英镑后,Chrome现在还可以,即3000万英镑后的9英镑。而且我还没有检查FF

你的最终情况如何?这是一个无限循环。嘿@wylie。。。萨迪克的问题完全一样。。。如果我们在js中创建循环。。。为什么浏览器没有终止进程?@Wylie:我想问题是,如果循环没有创建任何持久的东西,为什么它会耗尽内存?gc不应该回收临时对象吗?@Sadeq:这段代码实际上对我来说运行得很好,只在chrome上测试过。也就是说,如果你只想每100Ms增加一些东西,直到用户关闭窗口,考虑使用<代码> SETIFATION(ADDCORT,100)。看。另一个性能问题是,引号中有
“addcounter()”
,这意味着它被传递到
eval()
,速度非常慢。如果你直接传递函数,它会执行得更快。我用这段代码来模拟/测试我的内存泄漏的真正问题!我知道这是性能不好的代码。在实际工作中,我有几个不同的计时器使用AJAX查询更改页面内容,这会导致内存泄漏。如果我除了用新的元素值替换元素值之外,什么都做,那就没有问题了。+1用于去掉
setTimeout
调用中的字符串用法,否则会调用
eval
,这完全是浪费。正如我上面所说,这是一个模拟真实代码中发生的情况的代码。您是否尝试将
setTimeout
s更改为函数引用而不是字符串?关于错误URL,这既不是CPU滥用,也不是性能问题。这是关于内存泄漏的。谢谢你们关于MeMShrink的介绍,我已经读过了。@sadeq这是唯一一个说firefox等可能被误解的例子问题:D
<html>
    <body>
        <h1 id="t">Initial</h1>
            <script>
                var cnt=0;
                setTimeout(addCounter,100);
                addCounter=function(){
                    ++cnt;
                    if (cnt>1000000) cnt=0;
                    document.getElementById('t').firstChild.nodeValue='Counter: #'+(cnt);
                    setTimeout(addCounter,100);
                }
            </script>
    </body>
</html>