Angular 2、Javascript、内存使用和垃圾收集

Angular 2、Javascript、内存使用和垃圾收集,angular,memory,garbage,Angular,Memory,Garbage,我完全不知所措,并且由于内存使用方面的问题,我感觉放弃使用Angular 2来构建真实世界的应用程序 我遵循了所有的最佳编码实践,如在不再需要时将所有属性置零、删除对属性的所有引用、清空数组等,正确寻址闭包等 尽管如此,在Angular 2中测试一些非常基本的功能时,我在运行时继续遇到各种DOM基本操作的内存使用率不断增加的问题 仅举一个示例,它在执行过程中使用了大量内存,而这些内存从未被垃圾收集: 随时间设置div宽度的动画 我尝试用几种不同的方法实现这种UI行为,最有效的方法是在reques

我完全不知所措,并且由于内存使用方面的问题,我感觉放弃使用Angular 2来构建真实世界的应用程序

我遵循了所有的最佳编码实践,如在不再需要时将所有属性置零、删除对属性的所有引用、清空数组等,正确寻址闭包等

尽管如此,在Angular 2中测试一些非常基本的功能时,我在运行时继续遇到各种DOM基本操作的内存使用率不断增加的问题

仅举一个示例,它在执行过程中使用了大量内存,而这些内存从未被垃圾收集:

随时间设置div宽度的动画

我尝试用几种不同的方法实现这种UI行为,最有效的方法是在requestAnimationFrame中使用interval,并将其包装在Angular的
zone.runOutsideOfAngular
方法中

无论如何,将以下行放在循环中会使用大量内存,即使使用cancelAnimationFrame正确取消循环、清空循环中使用的属性以及对div的所有引用并从DOM中删除div,这些内存也不会被垃圾收集

this.renderer.setStyle(this.progressBar.elRef.nativeElement.querySelector('.progress-inner'), 'width', percentProgress+'%');
正如我相信你可以告诉,这是一个从一个修改进度条宽度的方法采取的一行。同样,请注意,我尝试了几种不同的方式实现进度条。使用CSS来制作动画,而不是使用上述方法

一般来说,不管我做什么,不管我试图实现什么,这么多与动画有关的动作,甚至像滚动这样的动作似乎都需要不断增加的内存来执行,而在Angular 2应用程序中,这些内存从来不会被垃圾收集

因此,简而言之,这篇文章并不特定于间隔,也不特定于设置div宽度的动画。Angular 2应用程序中的几乎所有任务似乎都使用了大量从未被垃圾收集过的内存

有人能提供一些指导吗? 推荐一本关于内存使用和Javascript的书


我遇到了如此多的内存使用问题,这真是令人难以置信地沮丧。促使我想放弃使用Angular 2。如果你使用的是Observable,请确保你
取消订阅()。不要只是将它们设置为null。如果这是您的问题,那么看看smart和presentational组件。这是一个angular2范例,它可以在组件被销毁后为您收集垃圾

过去,我将订阅推送到一个数组中,然后取消订阅onDestroy

ngOnInit(){
   this.subs.push(this.myObservable.subscribe(/*logic*/))
}

ngOnDestroy() {
  for (let sub = 0; sub < this.subs.length; sub++) {
    this.subs[sub].unsubscribe();
  }
}
ngOnInit(){
this.subs.push(this.myObservable.subscribe(/*logic*/))
}
恩贡德斯特罗(){
for(设sub=0;sub

也考虑使用<代码> [ngStule] =“{宽”:CaltualWithTh()} /<代码>来调整元素的大小,这对你有效。刚刚在组件中定义了

calculateWidth()
逻辑,并将转换添加到样式表
transition:width.4s立方贝塞尔(.25、.8、.25、1)


尽量避免渲染器出现安全问题。相反,我们应该通过
@Input()
装饰器将数据传递给子组件。然后使用
ngOnChanges
changeDetection:ChangeDetectionStrategy.OnPush
允许组件重新加载。角度像那样快,动画在渲染之间仍然可以工作

如果您使用的是观察对象,那么请确保您
取消订阅()
。不要只是将它们设置为null。如果这是您的问题,那么看看smart和presentational组件。这是一个angular2范例,它可以在组件被销毁后为您收集垃圾

过去,我将订阅推送到一个数组中,然后取消订阅onDestroy

ngOnInit(){
   this.subs.push(this.myObservable.subscribe(/*logic*/))
}

ngOnDestroy() {
  for (let sub = 0; sub < this.subs.length; sub++) {
    this.subs[sub].unsubscribe();
  }
}
ngOnInit(){
this.subs.push(this.myObservable.subscribe(/*logic*/))
}
恩贡德斯特罗(){
for(设sub=0;sub

也考虑使用<代码> [ngStule] =“{宽”:CaltualWithTh()} /<代码>来调整元素的大小,这对你有效。刚刚在组件中定义了

calculateWidth()
逻辑,并将转换添加到样式表
transition:width.4s立方贝塞尔(.25、.8、.25、1)


尽量避免渲染器出现安全问题。相反,我们应该通过
@Input()
装饰器将数据传递给子组件。然后使用
ngOnChanges
changeDetection:ChangeDetectionStrategy.OnPush
允许组件重新加载。Angular就是这样的速度,动画在渲染之间仍然可以工作

尽管本文是针对Angular的,但您可以将其与应用程序联系起来。下面是。虽然本文是针对Angular的,但您可以将其与您的应用程序联系起来。这是你的电话号码。