3

我已经阅读了许多关于 Javascript 内存管理的 Stack 文章和博客文章。

我的理解是,当所有对它们的引用都被删除时,在给定范围内的变量被标记为清理。大多数“内存泄漏”似乎与通过范围链接或链接到 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>

这只是在窗口范围内创建了变量,因此它们驻留在内存中。

<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"));
        bigString1 = null;
        bigString2 = null;
        bigString3 = null;
        bigString4 = null;
        bigString5 = null;
    </script>
</body>
</html>

但是,从内存中删除它们并不会减少内存使用量。

<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>

即使将它们放在完成的范围内,也不会将它们从内存中删除。

自己试试。在活动监视器中观察内存分配。所有三个 HTML 文件都分配和保留完全相同数量的 RAM。

谁能帮忙指出我在这里遗漏了哪些信息?我们究竟怎样才能让 Javascript 从未使用的数据中释放内存?

例如,如果我继续运行

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

一遍又一遍,每次浏览器分配大约 20mb 的 RAM。我可以让计算机在那里坐几个小时,而 RAM 永远不会被释放。如果 RAM 被保留但被清除,那么一次又一次地运行相同的命令只会一遍又一遍地使用相同的内存空间。

4

1 回答 1

1

chrome 很可能会保留分配的内存以供以后重新使用。您应该能够在已分配(但未使用)的内存中创建新数组。

更新 我刚刚在 Linux Mint 上使用 Chrome 23 自己测试了这个。

跑步

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

在页面使用的任何内容之上分配大约 20MB。在控制台中反复向代码段发送垃圾邮件不会进一步增加内存使用量。大约 30 秒后,内存被回收。

于 2012-12-12T20:59:35.500 回答