ERRO FATAL: CALL_AND_RETRY_LAST A alocação falhou – processo sem memory

A versão do nó é v0.11.13

Uso de memory durante a queda de acordo com o sudo top não aumenta mais de 3%

Código que reproduz esse 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 existe um problema no tamanho da pilha de recursion, 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, executei o código que me deu FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed – processo sem memory com o mesmo parâmetro –stack-size = 60000 e Segmentation fault .

Então eu concluo CALL_AND_RETRY_LAST não tem nada comum com o tamanho da pilha de recursion.

Como eu poderia resolver esse problema? Eu acredito que há memory livre suficiente no meu computador para concluir esta tarefa com sucesso.

Existem questões semelhantes no stackoverflow, mas nenhuma destas questões é sobre o CALL_AND_RETRY_LAST , por isso criei uma questão separada.

Se você der uma olhada na fonte: github / v8 , parece que você está tentando reservar um object muito grande? Minha experiência é que isso acontece se você tentar analisar um object JSON enorme, mas quando tento analisar sua saída com JSON e node0.11.13, ele simplesmente funciona bem.

Você não precisa de mais --stack-size , você precisa de mais memory: --max_new_space_size e / ou --max_old_space_size .

A única dica que posso dar a você além disso: tente outro analisador JSON e / ou tente alterar o formato de input para a linha JSON, em vez de apenas para JSON.

Para resolver esse problema, você precisa executar seu aplicativo aumentando o limite de memory usando a opção --max_old_space_size . Por padrão, o limite de memory do Node.js é de 512 mb.

 node --max_old_space_size=2000 server.js 

Descobri que max_new_space_size não é uma opção no nó 4.1.1 e max_old_space_size sozinho não resolveu meu problema. Estou adicionando o seguinte ao meu shebang e a combinação deles parece funcionar:

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

[UPDATE]: Também descobriu este erro enquanto estava executando o grunhido que anteriormente foi executado da seguinte forma:

 ./node_modules/.bin/grunt 

Depois de atualizar o comando para o seguinte, ele parou de ter erros de memory:

 node --max_old_space_size=2048 ./node_modules/.bin/grunt 
 sudo npm install -g increase-memory-limit 

Executar a partir do local raiz do seu projeto:

 increase-memory-limit 

Esta ferramenta irá append –max-old-space-size = 4096 em todas as chamadas de nó dentro de seus arquivos node_modules / .bin / *.

Apenas uma variação nas respostas acima.

Eu tentei o comando up node acima sem sucesso, mas a sugestão deste problema de CLI Angular funcionou para mim – você cria um script Node em seu arquivo package.json para aumentar a memory disponível para Node quando executa sua construção de produção.

Portanto, se você quiser aumentar a memory disponível para 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 memory dependendo das suas necessidades também – 4gb funcionou para mim, mas você pode precisar de mais ou menos). Você poderia então adicioná-lo à sua seção ‘scripts’ do package.json desta forma:

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

Ele estaria contido no object scripts junto 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 (você pode precisar rodar o sudo npm run prod se estiver em um Mac ou Linux).

Note que pode haver um problema subjacente que está fazendo com que o Node precise de mais memory – isso não corrige isso se esse for o caso – mas pelo menos dá ao Node a memory necessária para executar a compilation.

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

A partir da v8.0 entregue em agosto de 2017, a variável de ambiente NODE_OPTIONS expõe essa configuração (consulte NODE_OPTIONS que chegou em 8.x! ). De acordo com o artigo, apenas as opções na lista de permissions na origem (nota: não é um link atualizado!) São permitidas, o que inclui "--max_old_space_size" . Note 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

O módulo de increase-memory-limit foi descontinuado agora. A partir do Nodejs v8.0 lançado em agosto de 2017, agora podemos usar a variável env NODE_OPTIONS para definir o max_old_space_size globalmente.

export NODE_OPTIONS=--max_old_space_size=4096

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

Eu perdi alguns dias com este problema …. até que descobri que em algum arquivo eu estava importando um arquivo estático, um arquivo construído. Isso faz com que a construção nunca termine. Algo como:

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

A correção para a fonte real resolveu todo o problema.

Compartilhando minha solução. 🙂

Uma solução alternativa é desabilitar o compilador AOT:

 ng build --prod --aot false 

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

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

Coisa que funcionou para mim: eu estava importando um arquivo muito grande no código. A maneira como eu resolvi isso foi incluindo-o na lista de ignore em .babelrc algo assim:

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

Era um arquivo .js que realmente não precisava de transpilar e adicioná-lo à lista de ignorados ajudou.