Javascript 这个函数可以被垃圾回收吗?
想想这块蛋糕吧。。。ehm,代码:Javascript 这个函数可以被垃圾回收吗?,javascript,node.js,garbage-collection,v8,Javascript,Node.js,Garbage Collection,V8,想想这块蛋糕吧。。。ehm,代码: 'use strict' function doWork () { return new Promise(function (resolve, reject) { // work work work... // Done! But... where's the resolve() ??? }) } doWork().then(function doMoreWork () { // Some more work to do...
'use strict'
function doWork () {
return new Promise(function (resolve, reject) {
// work work work...
// Done! But... where's the resolve() ???
})
}
doWork().then(function doMoreWork () {
// Some more work to do...
})
一旦Promise构造函数中的函数完成
Promise
对象是否可以垃圾回收doMoreWork()
是否可以回收垃圾doMoreWork()
不能直接被GC调用,因为承诺保留了对它的引用,但是一旦承诺的主体完成并将执行上下文返回到上(?)范围,堆栈就会展开(因为这里没有更多要执行的语句),承诺就变得不可访问,因此是垃圾收集
你能确认我对这个话题的理解是正确的吗
我如何根据经验观察这种行为?换言之,我如何监控哪些对象正在被GC捕获以及何时被GC捕获?如果这有什么不同的话,我纯粹是在Node.js中开发的
Promise
对象没有指向它的引用,那么它是可收集的。
如果使用了doWork()。则(…)
将创建一个临时引用。因此,直到。然后
不再阻塞,因为存在对对象的引用,因此无法收集该对象doMoreWork
也是不可收集的,因为Promise
对象有一个对它的引用doWork()。然后(…)
可以替换为
new Promise(function (resolve, reject) {
// work work work...
}).then(function doMoreWork () {
// Some more work to do...
})
因此,您可以想象您正在直接使用Promise
对象,因此“上限”范围是使用对象的地方
对象通常在没有更多引用时收集。即使代码在承诺中,它也只是一个对象,并且对
的调用被链接,因此正在使用该对象没有任何东西保持对承诺的引用,因此它将被垃圾收集。promise是唯一保留对函数doMoreWork
引用的东西,因此它也将被垃圾收集
我怎么能凭经验观察这种行为?换言之,我如何监控正在对哪些对象执行GC操作以及何时执行GC操作?如果这有什么不同的话,我纯粹是在Node.js中开发的
V8中的GC不一定收集对象。例如,如果这是您的整个程序,那么首先运行任何GC都是浪费时间。要查看对象是否可以垃圾回收,您可以创建一个测试并查找内存泄漏(通过任务管理器)。如果您的代码编写正确,所有内容都会被收集。您的意思是您的工作从不调用resolve()
?是的,在这种情况下,gc会立即怀疑您的所有对象。我认为Esailija的答案应该是正确的,但如果不知道Promise的实现,就无法证明它。创建承诺,对其执行单个.then()调用,然后,根据代码,它是未使用的,因此承诺和then()的参数都可以循环使用。但是,如果您的承诺实现保留了某种内部列表或创建的承诺表,该怎么办?也许解决了问题,他们就可以自由了;也许永远不会。我的猜测是,他们不会以这种方式编写承诺实现;但是没有证据。不管怎样,你的JS程序都无法区分两者之间的区别。