【问题标题】:Garbage collect unused modules垃圾收集未使用的模块
【发布时间】:2018-10-21 10:02:59
【问题描述】:

我正在使用动态导入来加载用户在浏览器中编写的脚本。我首先将脚本内容放入 blob,然后使用动态 import() 将脚本作为模块加载。随着时间的推移,我希望这些脚本会改变并被销毁,因此相应的模块会被垃圾收集。但是,根据 Chrome 中的内存分析,这并没有发生。

原因似乎与名为ModuleMap 的东西有关。这是我在所有脚本不再使用后拍摄的内存快照的屏幕截图。

如您所见,Window 对象提供了通向这些模块的保留路径。只要是这样,我肯定最终会耗尽内存,因为每次用户编辑他们的脚本时都会创建这些模块。

我想知道是否有办法让 Chrome(和其他浏览器)在这些模块不再使用时卸载它们。

【问题讨论】:

    标签: javascript ecmascript-6 es6-modules dynamic-import


    【解决方案1】:

    我从this spec 那里了解到,也许答案是您不能导致模块被卸载。这是因为任何给定的模块只能被每个 Document worker 解析一次。我无法保证一旦我丢弃了给定 URL 中的模块,我将永远不再使用它,因此 ModuleMap 无法允许收集东西。

    事实上,阅读 Chromium 源代码后,我没有看到任何对 UnregisterModuleScript 的调用。这完全有可能不是所有相关代码,但如果是,那么任何给定的ModuleMap 实例都将永远挂在其模块上。

    从理论上讲,我似乎可以从 WebWorkers 获得所需的行为,因为它们具有不同的全局范围。如果有人能告诉我我是否在吠叫正确的树,那会很有帮助。

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 2011-03-10
      • 2010-11-08
      • 2012-10-06
      • 1970-01-01
      • 2023-03-24
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多