【问题标题】:Javascript memory management and garbage collectionJavascript内存管理和垃圾收集
【发布时间】:2012-11-30 16:06:24
【问题描述】:

我已经阅读了很多关于 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 被保留但被清除,那么一次又一次地运行相同的命令只会一遍又一遍地使用相同的内存空间。

【问题讨论】:

  • 我不认为“对象被垃圾回收 === 释放内存”。但是,当您执行几次时,您会看到它是否泄漏。

标签: javascript memory-management memory-leaks


【解决方案1】:

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

更新 我刚刚在 Linux Mint 上使用 Chrome 23 自己对此进行了测试。

跑步

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

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

【讨论】:

  • 我原以为这是怎么回事,但是为什么当我反复运行 (function(){ var bigString1=new Array(1000).join(new Array(2000).join(" XXXX3")); })();约 20mb 的新内存空间已分配且从未恢复?
  • 是每次都分配还是只在第一次运行时分配?
  • 老实说,我已经运行了很多次测试。有时它似乎像回答者建议的那样工作,但大多数时候它会在我每次运行命令时分配一个新的 20mb。我在这里有一个 Chrome 选项卡,它的内存使用量为 600mb 一个多小时。我所做的只是一次又一次地在控制台中运行该命令。再次运行它,它会上升到 620mb。我在 Mac OSX 上使用 Chrome 23 和 FF16。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2011-02-26
  • 2013-04-25
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多