Ho scoperto che l'utilizzo di AngularFireAuthModule
from '@angular/fire/auth';
provoca una perdita di memoria che provoca l'arresto anomalo del browser dopo 20 ore.
Versione:
Uso l'ultima versione aggiornata oggi usando ncu -u per tutti i pacchetti.
Fuoco angolare: "@angular/fire": "^5.2.3",
Versione Firebase: "firebase": "^7.5.0"
,
Come riprodurre:
Ho creato un codice minimo riproducibile sull'editor StackBliztz
Ecco il link per testare direttamente il bug StackBlizt test
Sintomo:
Puoi verificare che il codice non faccia nulla. Stampa solo ciao mondo. Tuttavia, la memoria JavaScript utilizzata dall'app angolare aumenta di 11 kb / s (Chrome Task Manager CRTL + ESC). Dopo 10 ore di apertura del browser, la memoria utilizzata raggiunge circa 800 mb (il footprint della memoria è circa due volte 1,6 Gb !)
Di conseguenza, il browser esaurisce la memoria e la scheda Chrome si arresta in modo anomalo.
Dopo ulteriori indagini utilizzando la profilazione della memoria di Chrome nella scheda delle prestazioni, ho notato chiaramente che il numero di ascoltatori aumenta di 2 ogni secondo e quindi l'heap JS aumenta di conseguenza.
Codice che causa la perdita di memoria:
Ho scoperto che l'uso del AngularFireAuthModule
modulo provoca la perdita di memoria sia che sia iniettata in un component
costruttore o in a service
.
import { Component } from '@angular/core';
import {AngularFireAuth} from '@angular/fire/auth';
import {AngularFirestore} from '@angular/fire/firestore';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'memoryleak';
constructor(public auth: AngularFireAuth){
}
}
Domanda :
Potrebbe essere un bug nell'implementazione di FirebaseAuth e ho già aperto un problema con Github, ma sto cercando una soluzione per questo problema. Sono alla disperata ricerca di una soluzione. Non mi dispiace anche se le sessioni tra le schede non sono sincronizzate. Non ho bisogno di quella funzione. L'ho letto da qualche parte
se non si necessita di questa funzionalità, gli sforzi di modularizzazione di Firebase V6 ti permetteranno di passare a localStorage che ha eventi di archiviazione per il rilevamento di modifiche a campi incrociati e forse ti darà la possibilità di definire la tua interfaccia di archiviazione.
Se questa è l'unica soluzione, come implementarla?
Ho solo bisogno di qualsiasi soluzione che fermi questo inutile aumento dell'ascoltatore perché rallenta il computer e blocca la mia app. La mia app deve funzionare per più di 20 ore, quindi ora è inutilizzabile a causa di questo problema. Sono alla disperata ricerca di una soluzione.