我想触发JavaScript垃圾收集。是否有可能?为什么我要或不想这样做?
最佳答案
我走了一小段路,寻求对您的一个问题的答案:有可能吗?
镇上的所有人都说删除引用将达到目的。有人说,删除对象是额外的保证(example)。因此,我写了一个脚本,尝试了这本书中的所有技巧,但我惊讶地发现在Chrome(22.0.1229.79)和IE(9.0.8112.16421)中,垃圾回收似乎根本无法正常工作。 Firefox(15.0.1)的管理除一个缺点外,没有任何重大缺点(请参见下面的情况4f)。
在伪代码中,测试进行如下操作。
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没有有效的垃圾收集器。