【发布时间】:2019-04-12 09:08:18
【问题描述】:
我目前正在开发一个 Angular 应用程序,该应用程序应该 24/7 运行至少一个月(制造软件)。 客户端仅接受每月仅发生一次浏览器重启(维护间隔)。 我们实现的第一个用例只包含一个向用户显示一些信息的组件。 此时没有用户交互!信息从服务器推送到客户端。 目前我只是从服务器轮询数据更新并向用户显示信息。
当前200ms的间隔只是为了研究目的,在真实场景中是1000ms。 下面的代码在 Chrome 中在 3 小时内导致内存增加约 40MB,并且 cpu 使用率增加高达 50%(消耗两个核心之一)。
推送通知的目标技术是 SignalR。 由于我使用 SignalR 发现了内存问题,因此此处提供的轮询实现用于调查 SignalR 库是否是问题所在。 不幸的是,我在这里遇到了同样的问题。
当然,每 30 分钟执行一次 window.location.reload() 可以“解决”问题,但这不是一个好的解决方案。 如果我在 3 小时后执行重新加载,页面就会崩溃,Chrome 会显示“哦,不……崩溃”。 我正在使用 Chrome 73 和 Edge,Edge 的内存增加明显高于 Chrome。 使用 Angular 7.2
<div *ngIf="info" style="width: 100%; height: 100%; margin: 0 auto;">
<div class="info status{{ info.Status }}">
<div class="location"><p class="font2">{{ info.Location }}</p></div>
<!-- ... further div elements here but no other *ngIf or *ngFor -->
<div *ngIf="info?.Details" class="no-padding">
<div class="column1 no-padding" *ngFor="let item of info.Details">
<div class="inverse"><p class="font1">{{ item.Name }}</p></div>
</div>
</div>
<img class="icon" src="assets/Icon{{info.Icon}}.png"/>
</div>
</div>
</div>
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Subscription, interval, Subject } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { Info } from '../data/info';
@Component({
selector: 'app-info',
templateUrl: './info.component.html',
styleUrls: ['./info.component.scss']
})
export class InfoComponent implements OnInit, OnDestroy {
subscribetimer: Subscription;
subscribelistener: Subscription;
listener: Subject<Info>;
info: Info;
constructor(private http: HttpClient) { }
ngOnInit() {
this.listener = new Subject<Info>();
this.subscribelistener = this.listener.subscribe(unit => this.info = unit);
this.subscribetimer = interval(200)
.subscribe(data => {
this.http.get<Info>(`http://localhost:5000/poll`)
.subscribe(res => this.listener.next(res));
});
}
ngOnDestroy() {
this.subscribetimer.unsubscribe();
this.subscribelistener.unsubscribe();
}
}
我希望我可以 24/7 全天候运行这个小型应用程序至少一个月,而不会出现内存和 CPU 消耗问题。
【问题讨论】:
-
将http响应推送到主题有什么特殊原因吗?
-
实际上,在这种情况下不是,主题是从 ng2-signalr 库使用中遗留下来的。您对使用主题有任何顾虑吗?
-
@M4n1,也检查一下这个"How to detect rxjs related memory leaks in Angular apps" 问题——它提到了一些有用的工具。
标签: angular rxjs angular-httpclient