gpt4 book ai didi

javascript - Angular:垃圾收集组件

转载 作者:行者123 更新时间:2023-12-02 21:38:09 24 4
gpt4 key购买 nike

我尝试了解 GabageCollector 在组件被销毁后如何工作。我有以下案例:

应用程序组件:

export class AppComponent {
testCompoments = [1,2];

removeOne(id){
this.testCompoments.pop()
}

nop(){

}
}

应用程序HTML:

<ng-container *ngFor="let t of testCompoments">
<app-test [id]="t" (close)="removeOne($event)"></app-test>
</ng-container>
<br>

空 FN

测试组件:

export class TestComponent implements OnInit {

@Output()
public close = new EventEmitter()

@Input()
id;

constructor() { }

ngOnInit() {
}

closeClick(){
this.close.emit(this.id)
}

}

测试HTML:

<p>{{id}}</p>
<button (click)="closeClick()">close</button>

现在,当我启动应用程序并拍摄堆快照时,我会在内存中看到适量的对象: enter image description here

然后我通过单击关闭按钮删除组件并拍摄新快照: enter image description here

令我惊讶的是,还有两个物体?现在另外奇怪的是,如果我单击“EMPTY FN”按钮,它什么也不做(应用程序组件上的空功能),下一个快照如下所示: enter image description here

我对这个主题有几个问题:

  • GC 的详细工作原理是什么?对于我的特殊情况,我认为 GC 无法释放内存,因为仍然存在对该对象的引用。如何找出该引用所在的位置?
  • 为什么在第一个组件被移除后不调用GC,而是在之后调用空函数时调用GC?
  • 我是否必须关心这个“死”对象(假设测试组件订阅了一些可观察对象,但通过异步管道或在 ngOnDestroy 中正确取消订阅它们)?

最佳答案

Chrome 似乎在内存中为 ngFor 保留了一个实例。内存泄漏并不像看起来那么严重。

https://angular-garbage-collection-components.stackblitz.io/

通过比较 Chrome 上的快照:

  • 单击最后一个“关闭”将从 DOM 中删除该元素,但由于某种奇怪的原因将其保留在内存中。
  • 单击第一个“关闭”将从 DOM 中删除该元素,并且不会发生内存泄漏。
  • 通过单击“关闭”删除最后一个 TestComponent 将会在内存中留下一个 TestComponent。
  • 内存中的 TestComponent 数量永远不会超过 DOM 中项目的 1。
  • 当我添加新的 TestComponents 时,多余的项目将被清理并且没有可检测到的内存泄漏。

引用代码: https://stackblitz.com/edit/angular-garbage-collection-components

关于javascript - Angular:垃圾收集组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com