【发布时间】:2017-02-21 03:54:41
【问题描述】:
ES6 符号的无上限、动态创建是否会导致不可恢复的内存使用?
在 Erlang(以及以前的 Ruby)中,原子/符号的创建不会被垃圾回收。
似乎在全局符号注册表 (Symbol.for('string')) 中创建的符号无法被垃圾收集并保持全局唯一,但我可能会遗漏一些东西。在我看来,这似乎不是 ES6 规范所规定的。
【问题讨论】:
-
你标题中的问题完全是在主题上。但是,您 text 中的问题是题外话(基于意见)。
-
符号本身是原语。 The spec 没有说 GlobalSymbolRegistry 列表中的记录(持有键和相应的符号)被弱持有。所以我猜(因此不是答案)记录不是 GC'd。但是您必须创建 很多 组才重要。
-
@T.J.Crowder 已经在 JS 中写过符号是原语。原语首先不受垃圾收集的影响。引擎所能做的就是从列表中删除一个条目。无论哪种方式,这都没有任何意义。如果您将某些内容放入注册表,则引擎无法预测您将来是否会尝试获取它。
-
@zeroflagL,你不知道你在说什么。存储原语需要内存,如果内存未被回收,则存在内存泄漏。引擎不需要预测您是否会检索它。正确实施的引擎将检查您是否在范围内有符号,如果没有,则将它们从列表中删除。只要前一个返回的符号不在作用域内,下次返回不同的符号就没有关系,因为符号不支持除了与自身比较之外的任何操作。