Javascript 在JS/NodeJS中,当对象从数组中移除时,会发生什么情况?
我想运行一系列神经网络训练器,它运行在一个无限循环上,如下所示:Javascript 在JS/NodeJS中,当对象从数组中移除时,会发生什么情况?,javascript,arrays,node.js,memory,Javascript,Arrays,Node.js,Memory,我想运行一系列神经网络训练器,它运行在一个无限循环上,如下所示: Trainer.prototype.tick = function(){ // do the try something and record the score setTimeout(function(){ this.tick() },0); } 到目前为止,它做得很好,但当我想更新训练数据和神经网络时,我将从数组中删除trainer实例,并替换为新实例。 所以问题是它真的会删除旧实例并释放内存吗?Java
Trainer.prototype.tick = function(){
// do the try something and record the score
setTimeout(function(){
this.tick()
},0);
}
到目前为止,它做得很好,但当我想更新训练数据和神经网络时,我将从数组中删除trainer实例,并替换为新实例。
所以问题是它真的会删除旧实例并释放内存吗?Javascript是一种垃圾收集语言。这意味着当没有活动的、可访问的代码仍然具有对对象的引用时,它会自动从内存中删除对象。因此,如果从数组中删除该对象,并且代码中没有其他变量或属性引用该对象,那么该对象将有资格进行垃圾收集,系统将释放它所占用的内存 当您的
setTimeout()
处于活动状态时,仍然存在对对象的引用,因此在触发setTimeout()
之前无法对其进行垃圾收集。但是,由于您使用的计时器值为0
,计时器将很快启动,并且对对象的特定引用将被清除
但是,您的setTimeout()
会立即尝试调用this.tick()
。如果该调用成功,它将设置另一个setTimeout()
,这样它就永远不会停止,也永远不会被垃圾收集。你必须停止设置新的计时器来进行垃圾收集
但是,在您显示的代码中,
this
的值不会指向您的Trainer
对象,因此对this.tick()
的调用将失败,并且不会设置新的计时器,setTimeout()
运行且this.tick()
调用失败时,对象将准备好进行垃圾收集。Javascript是一种垃圾收集语言。这意味着当没有活动的、可访问的代码仍然具有对对象的引用时,它会自动从内存中删除对象。因此,如果从数组中删除该对象,并且代码中没有其他变量或属性引用该对象,那么该对象将有资格进行垃圾收集,系统将释放它所占用的内存
当您的setTimeout()
处于活动状态时,仍然存在对对象的引用,因此在触发setTimeout()
之前无法对其进行垃圾收集。但是,由于您使用的计时器值为0
,计时器将很快启动,并且对对象的特定引用将被清除
但是,您的setTimeout()
会立即尝试调用this.tick()
。如果该调用成功,它将设置另一个setTimeout()
,这样它就永远不会停止,也永远不会被垃圾收集。你必须停止设置新的计时器来进行垃圾收集
但是,在您显示的代码中,
this
的值不会指向您的Trainer
对象,因此对this.tick()
的调用将失败,并且不会设置新的计时器,setTimeout()
运行且this.tick()
调用失败时,该对象将准备进行垃圾收集。这是否意味着它将运行最后一个循环,然后将被完全删除?@HankPhung-我不知道“运行最后一个循环”是什么意思。对不起,我的意思是它将再运行一个循环,然后停止并删除?@HankPhung-我直到现在才意识到您的设置超时()
正在尝试调用this.tick()
,这将设置另一个setTimeout()
。但是,对this.tick()
的调用将因显示的代码而失败。无论如何,请看我在回答中添加的更多解释。这是否意味着它将运行最后一个循环,然后将被完全删除?@HankPhung-我不知道“运行最后一个循环”是什么意思。对不起,我的意思是它将运行一个循环,然后停止并删除?@HankPhung-我直到现在才意识到您的setTimeout()
正在尝试调用this.tick()
,这将设置另一个setTimeout()
。但是,对this.tick()
的调用将因显示的代码而失败。无论如何,请看我在回答中添加的更多解释。