ERRO FATAL: Falha na alocação de CALL_AND_RETRY_LAST - processo sem memória


187

A versão do nó é v0.11.13

O uso de memória durante a falha de acordo com sudo topnão aumenta3%

Código que reproduz este erro:

var request = require('request')
var nodedump = require('nodedump')

request.get("http://pubapi.cryptsy.com/api.php?method=marketdatav2",function(err,res)
{
    var data
    console.log( "Data received." );
    data = JSON.parse(res.body)
    console.log( "Data parsed."   );
    data = nodedump.dump(data)
    console.log( "Data dumped."   ); 
    console.log( data )
})

Para verificar se há um problema no tamanho da pilha de recursão, executei o próximo código com o parâmetro --stack-size = 60000

var depth = 0;

(function recurse() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);
    recurse();
})();

e tenho

264500 
Segmentation fault

Em seguida, corri o código que me fornece FATAL ERROR: CALL_AND_RETRY_LAST Falha na alocação - o processo fica sem memória com o mesmo parâmetro --stack-size = 60000 e não possui Segmentation fault.

Portanto, concluo CALL_AND_RETRY_LASTque não tem nada em comum com o tamanho da pilha de recursão.

Como eu poderia resolver esse problema? Acredito que haja memória livre suficiente no meu computador para concluir esta tarefa com êxito.

Existem perguntas semelhantes no stackoverflow, mas nenhuma delas é sobre CALL_AND_RETRY_LASTa razão pela qual eu criei uma pergunta separada.


3
Seu código funciona bem para mim com o Node.js 0.10.28. Foram necessários 1200 MB de memória virtual e imprimiu uma quantidade inacreditável de lixo na tela, mas parecia "funcionar".
John Zwinck

1
O lixo é exatamente o que eu queria comprar. O ruim é que o nó 0.10. * Não suporta geradores de harmonia, portanto, não posso usá-lo para esse fim.
user619271

Respostas:


112

Se você der uma olhada na fonte: github / v8 , parece que você tenta reservar um objeto muito grande. De acordo com a minha experiência, isso acontece se você tentar analisar um grande objeto JSON, mas quando eu tento analisar sua saída com JSON e node0.11.13, apenas funciona bem.

Você não precisa de mais --stack-size, precisa de mais memória: --max_new_space_sizee / ou --max_old_space_size.

A única dica que posso dar é tentar outro analisador JSON e / ou tentar alterar o formato de entrada para a linha JSON, em vez de apenas JSON.


10
Muito obrigado! Definir --max_old_space_size = 2000000, o que eu acredito que significa que ~ 2 GB resolveram meu problema. Variando - max_new_space_size não parece ter efeito algum.
user619271

Também dei uma olhada na fonte v8, mas não entendi o que estava acontecendo lá. Portanto, minhas chances de resolver isso sem a sua ajuda provavelmente tendem a zero. Então, obrigado novamente.
user619271

1
@ theWanderer4865, o que você quer dizer com "tente alterar o formato de entrada para a linha JSON, em vez de apenas JSON". Você poderia por favor elaborar? Obrigado.
titusmagnus

16
@ user619271 --max_old_space_size = 2048 é de 2 gb
Timeless

1
Haha .. @Timeless
technophyle

51
$ sudo npm i -g increase-memory-limit

Execute a partir do local raiz do seu projeto:

$ increase-memory-limit

Essa ferramenta anexará --max-old-space-size = 4096 em todas as chamadas de nós nos arquivos node_modules / .bin / *.


Versão do Node.js> = 8 - AVISO DE DEPRECAÇÃO

Desde NodeJS V8.0.0, é possível usar a opção --max-old-space-size. NODE_OPTIONS = opções ...

$ export NODE_OPTIONS=--max_old_space_size=4096

Olá, @ sol-ibit. O que significa o argumento 4096?
estebanpdl

1
Oi @estebanpdl, A solução para executar seu aplicativo Node.js. com maior memória é iniciar o processo com um sinalizador V8 adicional: --max-old-space-size. Você precisa anexar o tamanho de memória desejado em megabytes. O comando a seguir iniciará seu aplicativo com um limite de memória de 4 GB.
sol404

1
Definir a variável com export NODE_OPTIONS=--max_old_space_size=4096fez o truque para mim! Obrigado!
Tarator

46

Para resolver este problema que você precisa para executar o aplicativo, aumentando o limite de memória usando a opção --max_old_space_size. Por padrão, o limite de memória do Node.js é de 512 mb.

node --max_old_space_size=2000  server.js 

5
Existe um guia passo a passo de como fazer isso, por favor? Onde colo este código fiel: node --max_old_space_size=2000 server.js
Sr. Benedict

@ Mr.Benedict você faz isso quando inicia seu aplicativo.
easymoden00b

2
node --max_old_space_size = 2048 server.js ... é mais apropriado ... funciona obrigado
danday74

1
Eu tenho um aplicativo React no Google Cloud. Como posso fazer isso? Alguém pode guiar, por favor?
Shubham Kushwah

1
@ easymoden00b Não é node server.js, sim npm start. Como posso fazer isso?
Shubham Kushwah 02/01/19

30

Eu descobri que max_new_space_sizenão é uma opção no nó 4.1.1 e, por max_old_space_sizesi só, não resolveu meu problema. Estou adicionando o seguinte ao meu shebang e a combinação destes parece funcionar:

#!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096

[EDIT]: 4096 === 4 GB de memória, se o seu dispositivo estiver com pouca memória, você pode escolher uma quantidade menor.

[UPDATE]: Também descobri esse erro ao executar o grunt, que anteriormente era executado da seguinte maneira:

./node_modules/.bin/grunt

Depois de atualizar o comando para o seguinte, ele parou de ter erros de memória:

node --max_old_space_size=2048 ./node_modules/.bin/grunt 

4
Eu adicionei --max_old_space_size = 8192, ainda não resolveu o problema, mas se pendurar meu PC :(
Dhyey

Reduzi a quantidade de memória no exemplo de 8Gb para 4Gb, obrigado pelo feedback.
Jfunk

28

Nota: veja o aviso nos comentários sobre como isso pode afetar os aplicativos Electron.

A partir da v8.0, lançada em agosto de 2017, a variável de ambiente NODE_OPTIONS expõe essa configuração (consulte NODE_OPTIONS chegou no 8.x! ). De acordo com o artigo, são permitidas apenas as opções listadas na fonte (nota: não um link atualizado!), O que inclui "--max_old_space_size". Observe que o título deste artigo parece um pouco enganador - parece que NODE_OPTIONS já existia, mas não tenho certeza se expôs essa opção.

Então eu coloquei no meu .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Aviso: não configure isso como uma variável de ambiente na sua máquina Windows. Isso quebra tudo . Ele quebrou o GitKraken, Slack, o instalador do VS2017 (que é baseado em cromo), as extensões do VS2017 relacionadas ao Azure e até mesmo o item de menu "Extensões e atualizações" no VS2017.
Roman Starkov

Dê uma olhada em github.com/electron/electron/issues/12695 - parece que o Electron não travará com NODE_OPTIONS na 2.0.3 - mas eu configurei NODE_OPTIONS usando smartcd apenas em diretórios de projetos específicos para evitar esse problema github.com/cxreg / SmartCD
Ben Creasy

Ah, isso provavelmente explica por que o Discord e o VS Code não foram afetados.
Roman Starkov

1
Como fazer isso em uma máquina Windows?
Mahmoud Ezzat

16

O increase-memory-limitmódulo foi descontinuado agora. A partir do Node.js v8.0 lançado em agosto de 2017, agora podemos usar a NODE_OPTIONSvariável env para definir max_old_space_sizeglobalmente.

export NODE_OPTIONS=--max_old_space_size=4096

URL de referência: https://github.com/endel/increase-memory-limit


Onde você define isso? Eu estou usando uma compilação Azure DevOps e constrói estão falhando em agentes do Windows
int-i

Para evitar diferenças de plataforma cruzada, instale o cross-envmódulo globalmente e execute o terminal com esse comando #cross-env PORT=8000 node --max-old-space-size=4096 server.js
Ali Ali David

As compilações do Azure Devops são executadas nos agentes da Microsoft na nuvem; não há consoles para executá-los. Encontrei outra maneira de conseguir isso usando o PowerShell. Adicionado como resposta aqui.
int-i

13

Apenas uma variação nas respostas acima.

Tentei o comando straight up node acima sem êxito, mas a sugestão desse problema da CLI Angular funcionou para mim - você cria um script Node em seu package.jsonarquivo para aumentar a memória disponível para o Node ao executar sua compilação de produção.

Portanto, se você deseja aumentar a memória disponível para o Node para 4gb ( max-old-space-size=4096), seu comando Node seria node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (aumente ou diminua a quantidade de memória dependendo de suas necessidades - 4 GB funcionaram para mim, mas você pode precisar de mais ou menos). Você o adicionaria à seção 'scripts' do package.json assim:

"prod": "node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod"

Ele estaria contido no objeto scripts, juntamente com os outros scripts disponíveis - por exemplo:

"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "prod": "node --max-old-space-size=4096./node_modules/@angular/cli/bin/ng build --prod"
}

E você o executa chamando npm run prod(pode ser necessário executar sudo npm run prodse estiver em um Mac ou Linux).

Observe que pode haver um problema subjacente que está fazendo com que o Node precise de mais memória - isso não resolve esse caso - mas pelo menos fornece ao Node a memória necessária para executar a compilação.


6

Minha solução de trabalho é:

  • Instale o ambiente cruzado
    npm install --save-dev cross-env ou npm install -g cross-env.
  • O arquivo package.jsonadiciona um novo script de construção,
    por exemplo
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Use esse comando para construir na próxima vez.
    npm run build:prod:ios

  • Problema resolvido.


1

Perdi alguns dias com esse problema .... até descobrir que em algum arquivo estava importando um arquivo estático, um arquivo construído. Faz com que a construção nunca termine. Algo como:

import PropTypes from "../static/build/prop-types"; 

A fixação na fonte real resolveu todo o problema.

Compartilhando minha solução. :)


2
você poderia explicar sua solução um pouco mais? Estou com esse mesmo problema e está travando meu aplicativo. Tudo funciona bem nos primeiros minutos do aplicativo em execução, mas finalmente falha devido à falta de memória. Mas, durante esse período, o Sequelize funciona bem.
Porlune

1
O que aconteceu foi que meu IDE (WebStorm) incluiu automaticamente os js BUILDED em minhas fontes ... quando um arquivo (em minhas fontes) foi alterado, ele cria todos os arquivos em uma nova saída de js. Mas, se minhas fontes tiverem referências a arquivos criados, ele nunca será interrompido. Verifique qual arquivo está incluindo um arquivo incorreto.
Tiago Gouvêa

1

Eu estava vendo esse problema quando estava criando um pacote para reagir nativo. Coisas que eu tentei e não funcionou:

  1. Aumentar o node --max_old_space_size, intrinsecamente, isso funcionou localmente para mim, mas falhou no jenkins e ainda não tenho certeza do que está errado com o jenkins
  2. Alguns lugares mencionados para fazer o downgrade da versão do nó para 6.9.1 e isso também não funcionou para mim. Gostaria apenas de colocar isso aqui, pois pode funcionar para você.

O que funcionou para mim: eu estava importando um arquivo muito grande no código. A maneira como resolvi foi incluí-lo na ignorelista em .babelrcalgo assim:

{
    "presets": ["react-native"],
    "plugins": ["transform-inline-environment-variables"],
    "ignore": ["*.json","filepathToIgnore.ext"]
}

Era um .jsarquivo que realmente não precisava ser transpilado e adicioná-lo à lista de ignorados ajudou.


1

esse erro ocorre quando a memória necessária alocada para execução é menor que a memória necessária para o processo em execução. Por padrão, o tamanho da memória do nó é 512 mb. Para aumentar isso, é necessário digitar o seguinte comando:

node --max-old-space-size= <NewSize> <fileName>

1
qual é o nome do arquivo aqui?
Rashedul.Rubel

1

Eu estava enfrentando esse problema no iônico e tentei muitas soluções, mas resolvi isso executando isso.

Para MAC: nó --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Para Windows: nó --max-old-space-size = 4096 / Usuários / {seu usuário} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

aumentar limite de memória

OU

  1. Navegue para a pasta% appdata% -> npm ou C:\Users\{user_name}\AppData\Roaming\npm
  2. Abra o ng.cmd no seu editor favorito
  3. Adicione --max_old_space_size=8192ao bloco IFeELSE

agora o arquivo ng.cmd fica assim após a alteração:

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)

1

Em uma máquina Windows, execute o comando abaixo

definir NODE_OPTIONS = - max_old_space_size = 4096



0

Qualquer pessoa que esteja recebendo esse erro nos pipelines de compilação do Azure, tente a etapa abaixo para alterar a variável de ambiente do agente de compilação

Adicione um Azure build pipeline task-> Azure powershell script:Inlinescriptantes de compilar com as configurações abaixo

- task: AzurePowerShell@3
  displayName: 'Azure PowerShell script: InlineScript'
  inputs:
    azureSubscription: 'NYCSCA Azure Dev/Test (ea91a274-55c6-461c-a11d-758ef02c2698)'
    ScriptType: InlineScript
    Inline: '[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--max_old_space_size=16384", "Machine")'
    FailOnStandardError: true
    azurePowerShellVersion: LatestVersion

0

#! / usr / bin / env node --max-old-space-size = 4096 no dint work do ionic-app-scripts.js

Mas depois da modificação: o seguinte arquivo funcionou

node_modules / .bin / ionic-app-scripts.cmd

Adicionando:

@IF EXIST "% ~ dp0 \ node.exe" ("% ~ dp0 \ node.exe" "% ~ dp0 .. @ ionic \ scripts de aplicativos \ bin \ ionic-app-scripts.js"% *) ELSE ( @SETLOCAL @SET PATHEXT =% PATHEXT:;. JS; =;% node --max_old_space_size = 4096 "% ~ dp0 .. @ ionic \ scripts de aplicativos \ bin \ ionic-app-scripts.js"% *)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.