gpt4 book ai didi

javascript - 在 Node 中强制进行垃圾收集以测试 WeakRef 和 FinalizationRegistry

转载 作者:行者123 更新时间:2023-12-04 03:45:44 28 4
gpt4 key购买 nike

我在玩 WeakRef and FinalizationRegistry in V8 ,并且我无法验证以下代码在 Node.js 中是否确实有效。
我正在使用 Node v15.3.0 并像这样运行它:node --expose-gc transient.js :
我希望看到一些 finalizerCallback called!控制台日志中的条目。
如果我在基于 Chromium 的浏览器中运行它(尝试 Run code snippet 按钮),如果单击 DevTools 的性能部分(在 Chrome v87 中)中的垃圾箱图标(收集垃圾),我可以获得该输出,而异步脚本仍然运行。
它在 Firefox v83 中按预期工作,我在脚本结束时看到所有终结器回调。
使用 Node,我希望在显式调用垃圾收集时自动看到它,但根本不会调用终结器回调。
代码本身有什么问题,还是有更可靠的方法在 Node 中强制 GC?

// by @noseratio
// see https://v8.dev/features/weak-references

class Transient {
constructor(eventTarget) {
const finalizerCallback = ({ eventTarget, eventListener }) => {
console.log('finalizerCallback called!');
eventTarget.removeEventListener('testEvent', eventListener);
}
const finalizer = new FinalizationRegistry(finalizerCallback);

const strongRefs = { finalizer };
const weakRef = new WeakRef(this);
const eventListener = () => {
console.log('eventListener called!');
strongRefs.finalizer = null;
weakRef.deref()?.test();
}

finalizer.register(this, { eventTarget, eventListener });

eventTarget.addEventListener('testEvent', eventListener, { once: true });
}

test() {
console.log("test called!");
}
}

async function main() {
const gc = globalThis?.global?.gc;
console.log(`garbage collector func: ${gc}`);

const eventTarget = new EventTarget();

for (let i = 10; i > 0; i--) {
void function () {
// these instances of Transient really must be getting GC'ed!
new Transient(eventTarget);
}();

await new Promise(r => setTimeout(() => r(gc?.(true)), 100));
}

console.log("finishing...")
gc?.(true);
await new Promise(r => setTimeout(r, 5000));

eventTarget.dispatchEvent(new Event("testEvent"));
console.log("done.")
}

main().catch(console.error);

更新 ,如果我增加 for 的数量循环集成,我最终会看到一些 finalizerCallback电话,但他们仍然是零星的。

最佳答案

我有 the answer直接来自 @jasnell :

You could try the natives syntax function %CollectGarbage


我已经尝试过了,它完全按照我想要的方式工作。在现实生活中,它是 AbortController 的链对象,更多上下文 here .
启用 %CollectGarbage :
node --allow-natives-syntax Transient.js
隐藏 %来自静态代码分析器的语法,我们可以使用 eval :
eval("%CollectGarbage('all')");

关于javascript - 在 Node 中强制进行垃圾收集以测试 WeakRef 和 FinalizationRegistry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65175380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com