Kok*_*oko 6 javascript garbage-collection
我正在构建一个使用var创建'level'对象的javascript游戏:
function start() {
var myGameLevel = new Level(2);
}
Run Code Online (Sandbox Code Playgroud)
这个"Level()"对象具有很多功能,主要是向DOM添加元素并使它们具有交互性.简化:
function Level(i) {
var _difficulty = i;
this.init = function(){
jQuery("#container").append(...game elements here...);
jQuery("#button").on('click', function() {...});
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:如何知道在'start'函数中创建的Level对象是否已被垃圾回收?我的目标是只使用"var"变量,以便没有外部引用.当DOM被清除所有游戏元素时,我预计"级别"对象将从内存中释放,但我怎么能确定?
Sup*_*ova 17
通常,JavaScript 中的垃圾收集是不确定的。您无法知道对象是否或何时被垃圾收集。这适用于强引用的对象。
在 ES12 及更高版本中,您可以使用FinalizationRegistry.
终结器允许您使用 JavaScript 回调来处理对象何时被垃圾回收。但限制在于,回调何时执行是不确定的。可能需要一分钟或一个小时。
// object creation
let abc = new Array(200).fill(true);
const cleanup = new FinalizationRegistry(key => {
// your code here
});
// tagging variable abc to finalizer
cleanup.register(abc, 'werwer');
// abc = null;
Run Code Online (Sandbox Code Playgroud)
弱引用被认为是安全风险,因此不适用于浏览器中的非特权代码.
这些问题不适用于特权代码或服务器端javascript执行,例如通过node.js,因此特定于平台的弱参考实现可能对他们可用.
例如firefox插件可以使用Components.utils.getWeakReference()
对于某些编程模式,WeakMap/WeakSet可能就足够了,但它们不允许程序观察垃圾收集,因为这样做需要一个键来探测这些数据结构,但是保持该键会阻止对象被收集到第一名.
JS实现者提出的另一个问题是,取决于假设的弱API API的强大程度 - 例如提供终结通知 - 它可能暴露大量的GC行为,这反过来可能会限制未来的实现,因为改变行为可能会破坏Web应用程序.
更新:现在有一个建议来标准化JS中的弱引用,通过将弱可达对象的释放绑定到JS事件循环来减轻感知风险,从而使行为更具确定性.
| 归档时间: |
|
| 查看次数: |
3173 次 |
| 最近记录: |