如何检测对象是否已在 Javascript 中被垃圾回收?
How to detect if an object has been garbage collected in Javascript?
我正在构建一个 javascript 游戏,它使用 var:
创建一个 'level' 对象
function start() {
var myGameLevel = new Level(2);
}
这个 "Level()" 对象有很多功能,主要是向 DOM 添加元素并使它们具有交互性。一个简化:
function Level(i) {
var _difficulty = i;
this.init = function(){
jQuery("#container").append(...game elements here...);
jQuery("#button").on('click', function() {...});
}
}
我的问题:我如何知道在 'start' 函数中创建的 Level 对象是否已被垃圾回收?我的目标是只使用 "var" 变量,这样就没有外部引用。当 DOM 中的所有游戏元素都被清除后,我预计 'level' 对象会从内存中释放出来,但我怎么能确定呢?
我认为您无法控制 JavaScript 垃圾收集。
通常,如果没有对变量或对象的引用,则可以收集该变量或对象。因此,您可以通过设计使对象超出范围的逻辑来增加收集对象的机会。
弱引用 are considered a security risk,因此不能用于浏览器中的非特权代码。
这些问题不适用于特权代码或服务器端 javascript 执行,例如通过 node.js,因此他们可以使用特定于平台的弱引用实现。
例如firefox 插件可以使用 Components.utils.getWeakReference()
对于某些编程模式 WeakMap/WeakSet 可能就足够了,但它们不允许程序观察垃圾回收,因为这样做需要一个密钥来探测这些数据结构,但持有该密钥会首先防止对象被收集。
JS 实现者表达的另一个担忧是,取决于假设的弱引用 API 的强大程度 - 例如提供完成通知 - 它可能会暴露大量的 GC 行为,这反过来可能会限制未来的实现,因为更改行为可能会破坏 Web 应用程序。
更新:现在 is a proposal 标准化 JS 中的弱引用,通过将弱可达对象的释放与 JS 事件循环相关联来减轻感知风险,使行为更具确定性。
更新 2:该提案已在各种浏览器中实现为 WeakRef
通常在 javascript 垃圾收集是不确定的。您无法知道某个对象是否或何时被垃圾回收。这适用于强引用的对象。
在ES12及之后的版本中,可以使用Finalizers
。
Finalizers 可让您使用 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;
我正在构建一个 javascript 游戏,它使用 var:
创建一个 'level' 对象function start() {
var myGameLevel = new Level(2);
}
这个 "Level()" 对象有很多功能,主要是向 DOM 添加元素并使它们具有交互性。一个简化:
function Level(i) {
var _difficulty = i;
this.init = function(){
jQuery("#container").append(...game elements here...);
jQuery("#button").on('click', function() {...});
}
}
我的问题:我如何知道在 'start' 函数中创建的 Level 对象是否已被垃圾回收?我的目标是只使用 "var" 变量,这样就没有外部引用。当 DOM 中的所有游戏元素都被清除后,我预计 'level' 对象会从内存中释放出来,但我怎么能确定呢?
我认为您无法控制 JavaScript 垃圾收集。 通常,如果没有对变量或对象的引用,则可以收集该变量或对象。因此,您可以通过设计使对象超出范围的逻辑来增加收集对象的机会。
弱引用 are considered a security risk,因此不能用于浏览器中的非特权代码。
这些问题不适用于特权代码或服务器端 javascript 执行,例如通过 node.js,因此他们可以使用特定于平台的弱引用实现。
例如firefox 插件可以使用 Components.utils.getWeakReference()
对于某些编程模式 WeakMap/WeakSet 可能就足够了,但它们不允许程序观察垃圾回收,因为这样做需要一个密钥来探测这些数据结构,但持有该密钥会首先防止对象被收集。
JS 实现者表达的另一个担忧是,取决于假设的弱引用 API 的强大程度 - 例如提供完成通知 - 它可能会暴露大量的 GC 行为,这反过来可能会限制未来的实现,因为更改行为可能会破坏 Web 应用程序。
更新:现在 is a proposal 标准化 JS 中的弱引用,通过将弱可达对象的释放与 JS 事件循环相关联来减轻感知风险,使行为更具确定性。
更新 2:该提案已在各种浏览器中实现为 WeakRef
通常在 javascript 垃圾收集是不确定的。您无法知道某个对象是否或何时被垃圾回收。这适用于强引用的对象。
在ES12及之后的版本中,可以使用Finalizers
。
Finalizers 可让您使用 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;