我想触发JavaScript垃圾收集。是否有可能?为什么我要或不想这样做?

最佳答案

我走了一小段路,寻求对您的一个问题的答案:有可能吗?

镇上的所有人都说删除引用将达到目的。有人说,删除对象是额外的保证(example)。因此,我写了一个脚本,尝试了这本书中的所有技巧,但我惊讶地发现在Chrome(22.0.1229.79)和IE(9.0.8112.16421)中,垃圾回收似乎根本无法正常工作。 Firefox(15.0.1)的管理除一个缺点外,没有任何重大缺点(请参见下面的情况4f)。

在伪代码中,测试进行如下操作。

  • 创建一个容器,一个数组,将容纳某种对象。我们在这里将其称为Bertil容器。
  • 其中的每个对象(作为Bertil中的元素)都应将自己的数组容器声明为属性。该数组将容纳很多字节。我们将把Bertil的任何元素称为对象Joshua。每个约书亚的字节数组将称为Smith

    这是您可以依靠的思维导图:
    Bertil [对象数组]-> Joshua [对象]-> Smith [字节数组]->未命名的[Bytes]。
  • 当我们将可用内存弄得一团糟时,请闲逛一两秒钟,然后执行以下任一“破坏算法”:

    4a。将删除操作数扔到主对象容器Bertil上。

    4b。向该容器中的每个对象扔一个删除操作数,杀死每个活着的约书亚。

    4c。在每个字节数组Smith上都添加一个删除操作数。

    4d。为每个约书亚分配NULL。

    4e。给每个约书亚分配UNDEFINED。

    4楼手动删除任何约书亚记中的每个字节。

    4克按照工作顺序进行上述所有操作。

  • 那怎么了? 如果 4a 4b 没有启动浏览器的垃圾收集器(GC)。万一 4c到4e 没有出现,Firefox会启动并显示一些概念证明。几分钟内就恢复了内存。使用某些变量的当前硬编码默认值作为测试配置时,case 4f 4e 导致Chrome挂起,因此我无法在此处得出任何结论。您可以随意使用自己的变量进行测试,链接将很快发布。 IE在4f和4e案件中幸存下来,但他的GC照常死了。出乎意料的是,Firefox幸存下来,但没有通过4f测试。 Firefox幸存下来并通过了4g测试。

    在所有情况下,如果浏览器的GC无法启动,等待至少10分钟都不能解决问题。重新加载整个页面会导致内存占用量增加一倍。

    我的结论是,我一定在代码中犯了一个可怕的错误,或者您的问题的答案是:不,我们不能触发GC。每当我们尝试这样做时,我们都会受到严厉的惩罚,我们应该把头埋在沙子里。请鼓励我继续,自己尝试这些测试用例。看一下代码中的注释细节。另外,下载页面并重写脚本,看看是否可以以更适当的方式触发GC。我肯定失败了,而且我无法终生相信Chrome和IE没有有效的垃圾收集器。

    09-08 08:16