- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想运行一组神经网络训练器,它像这样无限循环地运行:
Trainer.prototype.tick = function(){
// do the try something and record the score
setTimeout(function(){
this.tick()
},0);
}
到目前为止,它表现良好,但当我想更新训练数据和神经网络时,我将从数组中删除训练器实例并替换为新实例。那么问题是它真的会删除旧实例并释放内存吗?
最佳答案
Javascript 是一种垃圾收集语言。这意味着当没有事件的、可访问的代码仍然引用该对象时,它会自动从内存中删除对象。因此,如果您从数组中删除该对象,并且代码中没有其他变量或属性引用该对象,则该对象将有资格进行垃圾回收,并且系统将释放它占用的内存。
当您的 setTimeout()
处于事件状态时,仍然存在对您的对象的引用,因此在 setTimeout()
触发之前无法对其进行垃圾回收。但是,由于您使用的计时器值为 0
,计时器将很快触发,并且对该对象的特定引用将被清除。
但是,您的 setTimeout()
会立即尝试调用 this.tick()
。如果该调用成功,它将设置另一个 setTimeout()
,因此它永远不会停止,也永远不会被垃圾收集。您必须停止设置新的计时器才能对其进行垃圾收集。
但是,在您显示的代码中,this
的值不会指向您的 Trainer
对象,因此调用 this.tick()
将失败,并且不会设置新的计时器,一旦 setTimeout()
运行并且 this.tick()
调用失败,对象就会准备就绪用于垃圾收集。
关于javascript - 在 JS/NodeJS 中,当对象从数组中删除时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49684887/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!