【问题标题】:In JS/NodeJS what will happen to an object when it been removed from an array?在 JS/NodeJS 中,从数组中删除对象时会发生什么?
【发布时间】:2018-04-06 03:35:04
【问题描述】:

我想运行一组神经网络训练器,它在无限循环上运行,如下所示:

Trainer.prototype.tick = function(){
  // do the try something and record the score
  setTimeout(function(){
    this.tick()
  },0);
}

到目前为止它做得很好,但是当我想更新训练数据和神经网络时,我将从我的数组中删除训练器实例并替换为新实例。 那么问题来了,它真的会删除旧实例并释放内存吗?

【问题讨论】:

    标签: javascript arrays node.js memory


    【解决方案1】:

    Javascript 是一种垃圾收集语言。这意味着当没有活动的、可访问的代码仍然具有对该对象的引用时,它会自动从内存中删除对象。因此,如果您从数组中删除对象,并且代码中没有其他变量或属性引用该对象,则该对象将符合垃圾回收条件,系统将释放它占用的内存。

    当您的setTimeout() 处于活动状态时,仍然存在对您的对象的引用,因此在setTimeout() 触发之前无法对其进行垃圾收集。但是,由于您使用的计时器值为0,因此计时器将很快触发,并且对该对象的特定引用将被清除。

    但是,您的setTimeout() 会立即尝试呼叫this.tick()。如果该调用成功,它将设置另一个setTimeout(),因此它永远不会停止并且永远不会被垃圾收集。您必须停止设置新的计时器才能对其进行垃圾收集。

    但是,在您显示的代码中,this 的值不会指向您的Trainer 对象,因此对this.tick() 的调用将失败,并且不会设置新的计时器,并且一旦@987654330 @ 运行并且 this.tick() 调用失败,对象将准备好进行垃圾回收。

    【讨论】:

    • 这是否意味着它将运行最后一个圆圈然后将被完全删除?
    • @HankPhung - 我不知道“跑最后一圈”是什么意思。
    • 抱歉,我的意思是它会再运行 1 个循环然后停止并删除吗?
    • @HankPhung - 直到现在我才意识到你的setTimeout() 正在尝试调用this.tick(),这将设置另一个setTimeout()。但是,对this.tick() 的调用将因您显示的代码而失败。无论如何,请参阅我添加到答案中的更多解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多