O JavaScript mantém-se como uma das linguagens de programação mais populares, dada a sua adaptabilidade. Para executar código JavaScript fora do ambiente de um navegador, os programadores necessitam do Node.js, um ambiente de tempo de execução multiplataforma.
Um erro frequente ao trabalhar com projetos JavaScript no Node.js é o de falta de memória na pilha.
Este problema surge quando a memória padrão reservada pelo sistema é insuficiente para a execução de projetos maiores.
Quando o erro de “heap out of memory” ocorre, o programa é interrompido e mostra uma destas mensagens:
ERRO FATAL: Falha na alocação de CALL_AND_RETRY_LAST – pilha de JavaScript sem memória
Ou
Erro fatal: falha na alocação de tamanho de tabela inválida – heap javascript sem memória
Causas do Erro de Falta de Memória no Heap do JavaScript
- Estruturas de dados de grande porte: A manipulação de estruturas de dados volumosas, como arrays extensos, pode consumir muita memória, levando eventualmente ao erro de “heap out of memory”.
A seguir, um exemplo de uma estrutura de dados considerável com um bilhão de elementos:
let array = [];
for (let i = 0; i < 1000000000; i++) {
array.push(i);
}
- Gerenciamento inadequado de memória: À medida que uma aplicação se desenvolve, torna-se essencial liberar os objetos que já não são necessários.
O exemplo abaixo ilustra uma função que pode resultar num vazamento de memória:
let array = [];
setInterval(function() {
array.push(new Array(1000000).join("x"));
}, 1000);
- Ciclos infinitos: Este tipo de código executa-se indefinidamente, já que a condição de paragem nunca é atingida.
Este é um exemplo de um ciclo infinito que correrá para sempre:
while (true) {
console.log(1);
}
Ciclos infinitos podem levar a este erro por consumirem memória muito rapidamente.
- Funções recursivas: Uma função recursiva é aquela que se invoca a si própria, direta ou indiretamente, para repetir um conjunto de instruções até que determinadas condições sejam satisfeitas. Se estas funções não forem bem projetadas, podem esgotar a memória, levando ao erro de “heap out of memory”.
- Excesso de objetos num bloco de código: A presença de um grande número de objetos volumosos pode sobrecarregar a memória utilizada, resultando em erros.
Como Corrigir o Erro de Falta de Memória no Heap JS
Este erro pode surgir em diversos sistemas operacionais como Windows, macOS e Linux, incluindo o Ubuntu. A boa notícia é que a correção é possível, independentemente do sistema em uso.
#1. Corrigindo o Erro de Falta de Memória no Windows
Passo 1: No menu Iniciar, procure por “Configurações avançadas do sistema”.
Passo 2: Na caixa de diálogo, selecione “Variáveis de Ambiente” no canto inferior esquerdo.
Passo 3: Escolha “Novo” nas variáveis de utilizador ou nas variáveis do sistema. A primeira opção aplica as alterações apenas à conta de utilizador atual, enquanto a segunda aplica as alterações a todo o sistema.
Passo 4: Irão surgir duas opções; no “Nome da variável”, introduza NODE_OPTIONS e no “Valor da variável” introduza –max-old-space-size=4096. Nesta configuração, 4096 alocará 4 GB de memória virtual para o Node.js. Pode alocar mais, como 8 GB, alterando o valor para –max-old-space-size=8192.

Passo 5: Clique em “OK”, “Aplicar” e, finalmente, “OK” para guardar as alterações.
Também é possível usar o terminal Windows PowerShell para resolver o problema. Abra o terminal no Windows e introduza o seguinte comando:
env:NODE_OPTIONS="--max-old-space-size=4096"

Para uma solução temporária, pode executar este comando antes de iniciar a aplicação:
set NODE_OPTIONS=--max-old-space-size=4096
#2. Corrigindo o Erro de Falta de Memória no Linux
- Passo 1: Identifique a origem do erro. Consulte os logs ou a saída da consola para identificar as linhas de código/ficheiro que originam o erro.
- Passo 2: Exporte uma variável de ambiente especificando a memória virtual alocada para o Node.js. Utilize este comando:
export NODE_OPTIONS=--max-old-space-size=4096

Estes passos alocarão 4 GB de memória virtual ao Node.js. Se o erro persistir, pode aumentar o tamanho da memória, duplicando-o.
Por exemplo, para alocar 8 GB de memória virtual, utilize o seguinte comando:
export NODE_OPTIONS=--max-old-space-size=8192
#3. Corrigindo o Erro de Falta de Memória no macOS
No macOS, a correção do erro de “heap out of memory” é semelhante à do Linux. Siga estes passos:
- Passo 1: Identifique a fonte do erro, consultando os logs ou a saída da consola para determinar as linhas de código/ficheiro problemáticos.
- Passo 2: Exporte uma variável de ambiente com a memória virtual desejada para o Node.js. Use este comando:
export NODE_OPTIONS=--max-old-space-size=4096
Com isto, 4 GB de memória virtual serão atribuídos ao Node.js. Se o erro persistir, aumente o tamanho da memória, duplicando-o.
Por exemplo, para alocar 8 GB de memória virtual, utilize este comando:
export NODE_OPTIONS=--max-old-space-size=8192
Aumentando a Memória durante a Instalação do NPM
As soluções acima focam-se em erros que ocorrem na execução de aplicações Node.js. No entanto, é possível alocar memória virtual para resolver erros de falta de memória durante a instalação de pacotes JavaScript. Use este comando:
node --max-old-space-size=4096 (which npm) install
Nota: Pode continuar a aumentar a alocação de memória virtual em 1 GB, 2 GB, 3 GB ou 4 GB. O tamanho da memória deve ser especificado em MBs. Contudo, não aloque toda a memória da máquina ao Node.js, pois poderá levar a falhas. Como boa prática, se a sua máquina tiver 16 GB, poderá alocar até 8 GB ao Node.js.
Como Prevenir o Erro de Heap Out of Memory no JavaScript
Já exploramos como corrigir o erro de falta de memória no heap JavaScript. Felizmente, existem medidas que podem ser tomadas para evitar que este erro ocorra ao executar código JavaScript. Aqui ficam algumas abordagens eficazes:
#1. Dividir os Dados em Partes Menores
Um programa Node.js pode importar grandes conjuntos de dados de ficheiros CSV volumosos através de um processo ETL (Extrair – Transformar – Carregar). É possível que a aplicação falhe ao tentar importar os dados. Se estiver a usar o MongoDB, pode resolver o problema com um comando como:
split -l 1000000 users.csv
Este comando instrui o Node.js a dividir o ficheiro “users.csv” em vários ficheiros, contendo cada um 1.000.000 de utilizadores. O parâmetro -l especifica que o ficheiro deverá ser dividido com base no número de linhas.
#2. Monitorizar o Uso de Memória
Pode usar um profiler de memória para identificar vazamentos de memória no seu código. Para tal, pode combinar a ferramenta interna de memória do Node.js com as ChromeDevTools. Ambos conseguem detetar e corrigir problemas no código.
Também pode usar ferramentas externas como o Datadog, New Relic e AppDynamics para monitorizar o desempenho da aplicação e tomar as ações necessárias. O método process.memoryUsage() pode ser utilizado para verificar o uso de memória na aplicação Node.js.
#3. Evitar Vazamentos de Memória
Os vazamentos de memória ocorrem quando a sua aplicação Node.js mantém referências a objetos que já não são necessários. Se esses objetos não forem limpos pelo garbage collector, haverá uma acumulação de uso de memória ao longo do tempo.
Existem várias formas de evitar vazamentos de memória: evite variáveis globais no seu código, evite operações de E/S bloqueantes e utilize as palavras-chave let e const ao declarar variáveis, em vez de var.
#4. Criar Processos
Se estiver a executar o Node.js numa máquina com memória limitada, como um Raspberry Pi, é provável que se depare com erros de falta de memória. Pode criar um processo principal e outros processos que atuam como trabalhadores. Se o processo principal detetar que o sistema está a ficar sem memória, ele pode terminar esse processo e atribuir a tarefa a outro que não esteja sobrecarregado.
#5. Atualizar o Hardware
Caso o aumento da alocação de memória e as medidas para evitar erros de falta de memória não resolvam os seus problemas, pode considerar a atualização do seu hardware. O Node.js pode ser executado em RAM de até 512 MB. No entanto, a sua aplicação poderá exigir mais RAM à medida que cresce.
Por outro lado, aumentar o número de CPUs também pode melhorar a alocação de memória. Idealmente, 2 ou mais CPUs permitirão que a sua aplicação utilize threads de trabalho para tarefas intensivas, como criptografia e processamento de imagens.
Perguntas Frequentes
O que causa o erro de falta de memória no JavaScript?
Este erro pode ser causado por diversos motivos:
1. Vazamentos de memória
2. Ciclos infinitos
3. Excesso de objetos num projeto
4. Estruturas de dados de grande porte
O erro de pilha sem memória do JavaScript pode ser resolvido?
Sim. O erro pode ser resolvido através de:
1. Alocação de mais memória virtual ao Node.js
2. Eliminação de vazamentos de memória
3. Otimização do código
4. Atualização do hardware
Como resolver o erro Heap Out of Memory numa aplicação React?
React é uma das bibliotecas JavaScript mais populares. Localize o ficheiro package.json no diretório raiz e adicione estas linhas na secção de scripts:
"scripts": {
"start": "react-scripts --max_old_space_size=4096 start",
"build": "react-scripts --max_old_space_size=4096 build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
Conclusão
A maioria dos programadores está habituada a lidar com bugs e erros de código, não com erros de tempo de execução, durante a execução dos seus programas Node.js. Felizmente, o erro de “heap out of memory” tem solução. Definimos o que é este erro, explicamos como resolvê-lo e como preveni-lo no seu próximo projeto Node.js.
Em seguida, poderá também aprender a evitar alguns erros comuns em JavaScript.