我发现使用AngularFireAuthModulefrom '@angular/fire/auth';会导致内存泄漏,导致 20 小时后浏览器崩溃。
版本:
我使用今天更新的最新版本,对所有软件包使用 ncu -u。
角火: "@angular/fire": "^5.2.3",
Firebase 版本: "firebase": "^7.5.0",
如何重现:
我在StackBliztz 编辑器上做了一个最小的可重现代码
这里是直接测试bug的链接StackBlizt test
症状:
您可以自己检查代码是否没有任何作用。它只是打印 hello world。但是,Angular App 使用的 JavaScript 内存增加了11 kb/s(Chrome 任务管理器 CRTL+ESC)。打开浏览器 10 小时后,使用的内存达到约800 mb(内存占用量约为1.6 Gb 的两倍!)
结果,浏览器内存不足,chrome 选项卡崩溃。
在性能选项卡下使用chrome的内存分析进一步调查后,我清楚地注意到侦听器的数量每秒增加2个,因此JS堆相应增加。
导致内存泄漏的代码:
我发现使用该AngularFireAuthModule 模块会导致内存泄漏,无论是在component构造函数中还是在service.
import { Component } from '@angular/core';
import {AngularFireAuth} from '@angular/fire/auth';
import {AngularFirestore} from '@angular/fire/firestore';
@Component({
selector: 'app-root',
templateUrl: …Run Code Online (Sandbox Code Playgroud) 我实现了一个Web应用程序,并使用谷歌开发人员工具监控性能.我注意到听众不断增加,堆也是如此.
听众增加的部分看起来像这样
let ival = $interval(function () {
$http.get('someurl') // this call is actually done through a service, don't know if that matters
}, 1000)
Run Code Online (Sandbox Code Playgroud)
我会理解,如果堆增长是因为一些数据没有被垃圾收集器收集,但我不明白为什么听众会增加?
这是一个可重复的,最小的例子:
index.html文件:
<!doctype html>
<html ng-app="exampleModule">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<div ng-controller="someController">
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
和script.js文件:
angular.module("exampleModule", [])
.controller("someController", [ "$http", "$interval", function ($http, $interval) {
$interval(function () {
$http.get('script.js')
}, 1000)
}])
Run Code Online (Sandbox Code Playgroud)
观看演奏时的结果与上图中的相同.您应该使用简单的Web服务器来发出GET请求.