首页 > 解决方案 > Angular:垃圾收集组件

问题描述

我试图了解 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>

现在,当我启动应用程序并拍摄堆快照时,我会看到内存中正确数量的对象: 在此处输入图像描述

然后我通过单击关闭按钮删除一个组件并拍摄一个新快照: 在此处输入图像描述

令我惊讶的是,还有两个对象?现在另外奇怪的是,如果我单击“EMPTY FN”按钮,它什么都不做(应用程序组件上的空功能),下一个快照如下所示: 在此处输入图像描述

关于这个话题,我有几个问题:

标签: javascriptangularmemorygarbage-collection

解决方案


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

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

通过比较 Chrome 上的快照:

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

参考代码: https ://stackblitz.com/edit/angular-garbage-collection-components


推荐阅读