@wscld
Published on

Memory leak no Angular

Authors
  • avatar
    Name
    Wesley Caldas
    Twitter

Memory leak no Angular

Você tem se preocupado com o vazamento de memoria nos projetos angular? Os vazamentos de memória no podem ocorrer por diversas razões, e é importante estar ciente desses pontos para evitar problemas de desempenho e consumo excessivo de memória. Alguns dos principais motivos que podem gerar um memory leak no são:

  • Subscriptions: Não cancelar a inscrição de observáveis pode levar a vazamentos de memória. Observables continuam a receber e processar dados mesmo se o componente que criou a inscrição for destruído.

  • Event Listeners: Eventos ligados a elementos DOM, como window ou document, podem não ser removidos quando o componente é destruído.

  • Closures: Closures que capturam variáveis podem manter referências a objetos em escopo, impedindo que sejam coletados pelo coletor de lixo.

  • Serviços de Longa Duração: Serviços que mantêm referências a objetos que deveriam ter curta duração podem causar vazamentos de memória.

Algumas sugestões de como você pode evitar um vazamento de memória nesses cenários:

  • Cancelar as subscriptions: Sempre cancele as inscrições quando não forem mais necessárias. Você pode usar o padrão takeUntil ou o pipe async para lidar com isso automaticamente.
    private unsubscribe$ = new Subject<void>();
    ngOnDestroy() {
     this.unsubscribe$.next();
     this.unsubscribe$.complete();
    }

    someObservable.pipe(takeUntil(this.unsubscribe$)).subscribe();
  • Implemente guardas de rota CanDeactivate para cancelar inscrições de observáveis quando um usuário navega para longe de um componente.

  • Verifique como os services de longa duração mantêm referências. Se um serviço deve ter curta duração, certifique-se de liberar recursos e referências quando não for mais necessário.

  • Monitore continuamente o uso de memória de sua aplicação usando ferramentas de desenvolvedor do navegador. Observe o crescimento da memória durante testes e desenvolvimento.

  • Certifique-se de remover listeners de eventos quando os componentes são destruídos. Use o decorador @HostListener para gerenciar listeners de eventos e removê-los no hook de ciclo de vida ngOnDestroy.

    @HostListener('window:resize', ['$event'])
    onResize(event: Event) {
     // Lidar com o evento
    }

    ngOnDestroy() {
     window.removeEventListener('resize', this.onResize);
    }

Vazamentos de memória no Angular ocorrem quando uma aplicação web mantém referências a objetos que não são mais necessários, impedindo que o coletor de lixo do JavaScript recupere a memória. Esses vazamentos podem resultar em aumento do consumo de memória, desempenho mais lento e, potencialmente, falhas na aplicação. Vazamentos de memória podem ocorrer em qualquer aplicação baseada em JavaScript, se não tomarmos os devidos cuidados.

Chamadas com o HttpClient

O HttpClient no Angular não requer explicitamente a utilização do método unsubscribe para cancelar inscrições em observáveis. Isso ocorre porque os Observables retornados pelas chamadas do HttpClient são automaticamente gerenciados pela própria biblioteca.

O HttpClient utiliza o conceito de “observables de curta duração”. Quando você faz uma solicitação HTTP usando o HttpClient, o observable retornado representa a resposta da solicitação. No entanto, esse observable será concluído assim que a resposta for recebida, ou ocorrerá um erro durante a solicitação.