在关闭选项卡/窗口之前删除变量是否有助于释放内存?

Does deleting variables before closing the tab/window help releasing memory?

本文关键字:是否 变量 删除 有助于 释放 内存 选项 窗口      更新时间:2023-09-26

我正在维护一个JavaScript代码,其中一个函数执行一些繁重的处理以生成数组,并将结果保存在函数本身的缓存变量中。它是这样实现的:

function heavyProcessingStuff(x) {
    if(heavyProcessingStuff.cache == undefined) 
       heavyProcessingStuff.cache = [];
    if(heavyProcessingStuff.cache[x] != undefined) {
       return heavyProcessingStuff.cache[x]
    } else {
      return heavyProcessingStuff.cache[x] = x + 1
    }
}

奇怪的是,当页面被卸载时,有一个函数会手动删除缓存变量的每个属性,就像这样:

for (n in heavyProcessingStuff.cache) {
  delete heavyProcessingStuff.cache[n]
}

我很困惑为什么这样实现。
这是针对某个奇怪的极端情况吗?有这样做的动机吗?当页面关闭时,浏览器不应该收集所有内容吗?

Javascript使用垃圾收集,最好不要显式地释放内存。在"编写快速,内存高效的JavaScript"一文中的"去引用误解"中有很好的阅读。

引自文章:

JavaScript中不可能强制垃圾收集。你不希望这样做,因为垃圾收集过程是由运行时控制,它通常最清楚什么时候发生事情

如果没有看到完整的上下文,还有另一种可能性:

早期版本的IE(我知道IE6很容易受影响),使用一个简单的引用计数系统进行垃圾收集。问题是DOM和JavaScript保持了单独的引用栈。

这允许这样一种情况的发展:DOM(通过一个expando属性)可以保存一个JavaScript引用——而JavaScript保存一个DOM引用。

这个循环引用会造成内存泄漏,内存泄漏存在于页之外,并且只有在page窗口关闭时才会释放内存。

通常使用unload事件来释放内存并释放任何事件处理程序以避免这种情况。

在Chrome和Internet Explorer(或任何实现每个选项卡进程模型的浏览器)中,你是对的,绝对没有价值。事实上,尝试删除是在浪费CPU时间,因为通常当一个选项卡关闭时,一个进程就会被杀死,从而释放所有非共享资源。

对于单个进程的浏览器(Firefox仍然是,尽管正在进行改进),如果引用计数减少到0,这可能会使垃圾收集器更快地完成工作,但这可能也是毫无意义的。除了非常老的浏览器(例如IE6),每个现代垃圾收集器都可能在下一轮清除所有内容,无论您是否显式删除引用。