【问题标题】:Memory leak when Observable source object got destroyedObservable 源对象被破坏时的内存泄漏
【发布时间】:2021-03-03 23:21:00
【问题描述】:

当你订阅observable时会发生什么,那么这个observable的来源不再在应用程序中使用?有没有内存泄漏?我有FormArray,其中有一些FormGroup。我订阅了每个FormGroup.valueChanges,当FormGroupFormArray 中删除时,我是否需要退订? Subjects 也是如此,如果由于某种原因我会在 Component 中使用 Subject 并且该组件将被销毁,我是否需要取消订阅它们?我已阅读此答案Angular/RxJs When should I unsubscribe from `Subscription`,但我的情况一无所获。

【问题讨论】:

  • 对我来说,为了更加安全,我总是退订。要“完成”一个主题,请致电.complete()

标签: angular rxjs angular-reactive-forms


【解决方案1】:

我想说没有必要取消订阅。如果你这样做不会有任何伤害,但我认为没有必要。

你可以在this answer找到更详细的解释。

但要点是:在这种情况下,当从subscribes 的回调创建的订阅者仍然是Subject 的订阅者列表的一部分时,就会发生内存泄漏。这意味着当再次创建组件时,该类型的另一个订阅者将被添加到列表中,而旧的订阅者仍然存在。这就是发生内存泄漏的原因。

但是,如果您取消订阅,该订阅者将不再是该订阅者列表的一部分。我之所以说在这种情况下不需要取消订阅,是因为唯一仍然会引用该订阅者的东西,Subject 实例,这是防止该 old 订阅者成为垃圾的原因收集,将被取消。我的理由是:如果保持订阅者活着的东西被清空,那么订阅者的下一个回调就无法再次到达,所以它可以被垃圾收集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2018-02-26
    • 2011-10-02
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多