Javascript内存管理和垃圾收集

Javascript内存管理和垃圾收集,javascript,memory-management,memory-leaks,Javascript,Memory Management,Memory Leaks,我读过很多关于Javascript内存管理的堆栈文章和博客文章 我的理解是,在给定的范围内,当所有对变量的引用都被删除时,变量被标记为清除。大多数“内存泄漏”似乎与通过作用域链接的变量有关,或者与DOM元素链接,从而防止它们被垃圾收集 我试图理解为什么这三个代码段在Chrome和Firefox中需要相同的RAM使用: <html> <body> <script> var bigString1=new Array(1000).join(n

我读过很多关于Javascript内存管理的堆栈文章和博客文章

我的理解是,在给定的范围内,当所有对变量的引用都被删除时,变量被标记为清除。大多数“内存泄漏”似乎与通过作用域链接的变量有关,或者与DOM元素链接,从而防止它们被垃圾收集

我试图理解为什么这三个代码段在Chrome和Firefox中需要相同的RAM使用:

<html>
<body>
    <script>
        var bigString1=new Array(1000).join(new Array(2000).join("XXXX1"));
        var bigString2=new Array(1000).join(new Array(2000).join("XXXX2"));
        var bigString3=new Array(1000).join(new Array(2000).join("XXXX3"));
        var bigString4=new Array(1000).join(new Array(2000).join("XXXX4"));
        var bigString5=new Array(1000).join(new Array(2000).join("XXXX5"));
    </script>
</body>
</html>

每次浏览器分配~20mb内存时,都会一次又一次地进行。我可以让电脑在那里呆上几个小时,而内存永远不会被释放。如果RAM是保留的,但被清除了,那么反复运行相同的命令只会一次又一次地使用相同的内存空间

最有可能的是,chrome保留了分配的内存,以便以后重新使用。您应该能够在分配的(但未使用的)内存中创建新阵列

更新 我刚刚在LinuxMint上用Chrome23测试了这个

运行

(function(){ var bigString1=new Array(1000).join(new Array(2000).join("XXXX3")); })(); 

在页面使用的任何内容上分配大约20MB。在控制台中重复发送垃圾信息不会进一步增加内存使用。大约30秒后,内存被回收。

我不认为“被垃圾收集的对象===空闲内存”。但是,当您执行几次它时,您可以看到它是否会泄漏。我曾想象过这是怎么回事,但为什么我会重复运行(function(){var bigString1=new Array(1000).join(new Array(2000).join(“xxxxxx3”);})~分配了20mb的新内存空间,但从未恢复?是每次分配还是第一次运行它?老实说,我已经运行了很多次测试。有时,它似乎按照回答者的建议工作,但大多数情况下,每次我运行命令时,它都会分配一个新的20mb。我这里有一个Chrome标签,它的600mb内存使用率已经超过一个小时了。我所做的只是在控制台中反复运行该命令。再运行一次,它将上升到620mb。我在Mac OSX上使用Chrome 23和FF16。
<html>
<body>
    <script>
    var test = function(){
        var bigString1=new Array(1000).join(new Array(2000).join("XXXX1"));
        var bigString2=new Array(1000).join(new Array(2000).join("XXXX2"));
        var bigString3=new Array(1000).join(new Array(2000).join("XXXX3"));
        var bigString4=new Array(1000).join(new Array(2000).join("XXXX4"));
        var bigString5=new Array(1000).join(new Array(2000).join("XXXX5"));
        bigString1 = null;
        bigString2 = null;
        bigString3 = null;
        bigString4 = null;
        bigString5 = null;
    }
    test();
    </script>
</body>
</html>
(function(){ var bigString1=new Array(1000).join(new Array(2000).join("XXXX3")); })();
(function(){ var bigString1=new Array(1000).join(new Array(2000).join("XXXX3")); })();