O JavaScript continua sendo uma das linguagens de programação mais usadas devido à sua versatilidade. Para executar o JavaScript fora de um ambiente de navegador, os desenvolvedores devem instalar o Node.js, um ambiente de tempo de execução de plataforma cruzada.
O erro de falta de memória na pilha de JavaScript é comum ao executar um projeto JavaScript Node.js.
O problema de falta de memória do JavaScript é um erro que ocorre quando a memória padrão alocada pelo sistema do computador é insuficiente para executar um grande projeto.
Se você encontrar o erro heap out of memory, seu programa travará e exibirá esta saída;
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 pilha de memória insuficiente do JavaScript
- Presença de grandes estruturas de dados: trabalhar com grandes estruturas de dados, como matrizes ou arrays, pode consumir muito espaço, eventualmente causando erro de heap out of memory.
Este é um exemplo de uma grande estrutura de dados com um bilhão de elementos;
let array = []; for (let i = 0; i < 1000000000; i++) { array.push(i); }
- Gerenciamento de memória ruim: À medida que seu aplicativo cresce, você precisa liberar alguns dos objetos que não são mais necessários.
Este é um exemplo de uma função que leva ao vazamento de memória;
let array = []; setInterval(function() { array.push(new Array(1000000).join("x")); }, 1000);
- Loops infinitos: esse código é executado para sempre, pois uma condição de término nunca é alcançada.
Este é um exemplo de um loop infinito que será executado para sempre;
while (true) { console.log(1); }
Loops infinitos podem levar a esse erro, pois usam a memória muito rápido.
- Funções recursivas: Uma função recursiva é uma função que chama a si mesma indireta ou diretamente para repetir um/determinado conjunto de instruções até que uma(s) determinada(s) condição(ões) seja(m) atendida(s). Se essas funções forem bem projetadas, elas provavelmente levarão a um erro de memória e, eventualmente, a um monte de erros de memória.
- Presença de muitos objetos em um pedaço de código: Se seu código tiver muitos objetos grandes, a memória usada por esses objetos coletivamente pode levar a uma sobrecarga.
Corrigir o erro de falta de memória do heap JS
Esse erro pode ocorrer em sistemas operacionais baseados em Windows, macOS e Linux, como o Ubuntu. Felizmente, o erro pode ser corrigido, independentemente do seu sistema operacional.
#1. Corrigindo o erro de pilha de JavaScript sem memória no sistema operacional Windows
Etapa 1: clique no menu Iniciar e localize Configurações avançadas do sistema.
Etapa 2: clique em Variáveis de ambiente na parte inferior esquerda da caixa de diálogo.
Etapa 3: Clique em Novo em Variáveis de usuário ou Variáveis de sistema. A primeira opção aplica as alterações à conta do usuário atual. No entanto, a segunda opção aplica as alterações a todo o sistema.
Passo 4: Serão exibidas duas opções; no nome da variável, insira NODE_OPTIONS e no valor da variável, insira –max-old-space-size=4096. Nesta etapa, a figura 4096 alocará 4 GB de memória virtual para o Node.js. Você pode alocar mais, como 8 GB, definindo o valor como –max-old-space-size=8192.
Passo 5: Clique em ok, aplique e por fim, ok para salvar as alterações.
Você também pode usar o terminal do Windows PowerShell para resolver o erro. Abra o terminal em seu sistema operacional Windows e digite o seguinte comando;
env:NODE_OPTIONS="--max-old-space-size=4096"
Você também pode resolver o erro temporariamente executando este comando antes de executar seu aplicativo;
set NODE_OPTIONS=--max-old-space-size=4096
#2. Corrigindo o erro de pilha de JavaScript sem memória no Linux
- Passo 1: Identifique a origem do erro. Verifique os logs ou a saída do console para determinar as linhas de código/arquivo que estão causando o erro.
- Etapa 2: exporte uma variável de ambiente especificando a memória virtual que você alocou para o Node.js. Use este comando;
export NODE_OPTIONS=--max-old-space-size=4096
Essas etapas alocarão 4 GB de memória virtual para o Node.js. Se o erro persistir, você pode aumentar o tamanho da memória dobrando.
Por exemplo, se você deseja alocar 8 GB como memória virtual, pode executar este comando;
export NODE_OPTIONS=--max-old-space-size=8192
#3. Corrigindo o erro de pilha de JavaScript sem memória no macOS
Você pode resolver o erro de pilha de JavaScript sem memória no macOS usando uma abordagem semelhante à do Linux. Siga esses passos;
- Etapa 1: Identifique a origem do erro verificando os logs ou a saída do console para determinar as linhas de código/arquivo que estão causando o erro.
- Etapa 2: exporte uma variável de ambiente especificando a memória virtual que você alocou para o Node.js. Use este comando;
export NODE_OPTIONS=--max-old-space-size=4096
Essas etapas alocarão 4 GB de memória virtual para o Node.js. Se o erro persistir, você pode aumentar o tamanho da memória dobrando.
Por exemplo, se você deseja alocar 8 GB como memória virtual, pode executar este comando;
export NODE_OPTIONS=--max-old-space-size=8192
Aumentando a memória durante a instalação do NPM
As soluções que oferecemos até agora atendem a erros que ocorrem quando você executa um aplicativo Node.js. No entanto, você pode alocar memória virtual para resolver o erro de falta de memória ao instalar pacotes JavaScript. Use este comando;
node --max-old-space-size=4096 (which npm) install
Observação: você pode continuar aumentando a alocação de memória virtual em 1 GB, 2 GB, 3 GB ou 4 GB. Você deve especificar o tamanho da memória em MBs. No entanto, não aloque toda a memória da máquina para o Node.js, pois isso pode causar a falha do programa. Como boa prática, se sua máquina tiver 16 GB, você pode alocar até 8 GB para o Node.js.
Impedir o erro de heap out of memory do JavaScript
Até agora, discutimos como corrigir o erro de falta de memória do heap JavaScript quando ele ocorre. Felizmente, você também pode ter medidas para evitar que esse erro ocorra ao executar o código JavaScript. Estas são algumas das melhores abordagens:
#1. Divida os dados em pequenos pedaços
Você pode ter um programa Node.js que importa grandes conjuntos de dados de grandes arquivos CSV por meio do processo ETL: Extrair – Transformar – Carregar. Você pode descobrir que seu aplicativo sempre trava quando você tenta importar os dados. Se você estiver trabalhando com o MongoDB, poderá resolver o erro com uma instrução de linha de comando como;
split -l 1000000 users.csv
Este comando instrui o Node.js a dividir um arquivo chamado users em vários arquivos com 1.000.000 usuários cada. O sinalizador -l especifica que o arquivo deve ser dividido com base no número de linhas de código.
#2. Monitorar o uso de memória
Você pode usar um criador de perfil de memória para detectar vazamentos de memória em seu código. Você pode combinar a memória interna do Node.js e as ChromeDevTools para conseguir isso. Os dois podem detectar problemas em seu código e corrigi-los.
Você também pode usar ferramentas externas como Datadog, New Relic e AppDynamics para monitorar o desempenho do seu aplicativo e tomar as medidas necessárias. Você também pode verificar o uso de memória em seu aplicativo Node.js por meio do método process.memoryUsage().
#3. Evitando vazamentos de memória
Vazamentos de memória ocorrem quando seu aplicativo Node.js retém referências a objetos que não são mais necessários. Se esses objetos não forem coletados como lixo, haverá um acúmulo de uso de memória ao longo do tempo.
Existem várias abordagens para evitar vazamentos de memória, como evitar variáveis globais em seu código, evitar operações de E/S de bloqueio e usar as palavras-chave let e const ao declarar suas variáveis em vez de var.
#4. Processos de desova
Se você estiver executando o Node.js em uma máquina com memória limitada, como Raspberry Pi, provavelmente encontrará erros de falta de memória. Você pode ter um processo mestre e outros são agrupados como trabalhadores. Assim que o processo mestre detectar que o sistema está ficando sem memória, ele matará esse processo e atribuirá a tarefa a outro que não esteja sobrecarregado.
#5. Atualizar hardware
Se o aumento da alocação de memória e a execução dos processos listados para evitar erros de falta de memória não resolverem seus problemas, você pode considerar atualizar seu hardware. O Node.js pode ser executado em RAM de até 512 MB. No entanto, seu aplicativo 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 seu aplicativo use threads de trabalho para tarefas intensivas de CPU, como criptografia e processamento de imagens.
perguntas frequentes
O que causa o erro de falta de memória no JavaScript?
Esse erro pode ser causado por vários motivos;
1. Vazamentos de memória
2. Loops infinitos
3. Presença de muitos objetos em um projeto
4. Presença de grandes estruturas de dados
O erro de pilha sem memória do JavaScript pode ser resolvido?
Sim. Você pode resolver o erro através de;
1. Alocando mais memória virtual para Node.js
2. Eliminando vazamentos de memória
3. Otimizando seu código
4. Atualizando seu hardware
Como você pode resolver o erro Heap Out of Memory no aplicativo React?
React é uma das bibliotecas JavaScript mais populares. Localize o arquivo package.json no diretório raiz e essas linhas na seçã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" }
Empacotando
A maioria dos desenvolvedores está acostumada com bugs e erros de código, não erros de tempo de execução, enquanto executam seus programas Node.js. Felizmente, você não precisa se preocupar, pois o erro de heap out of memory pode ser corrigido. Definimos o que é o erro de heap de falta de memória do JavaScript, explicamos como resolvê-lo e como evitá-lo em seu próximo projeto Node.js.
Em seguida, você também pode ler como evitar alguns erros comuns de JavaScript.