FATAL HATASI: CALL_AND_RETRY_LAST Ayırma başarısız - işlem belleği yetersiz


187

Düğüm sürümü (şimdiki değeri) v0.11.13

Çarpışma sırasında bellek kullanımı sudo topartmıyor3%

Bu hatayı yeniden üreten kod:

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 )
})

Özyineleme yığını boyutu sorunu olup olmadığını kontrol etmek için --stack-size = 60000 parametresi ile sonraki kodu çalıştırdı

var depth = 0;

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

ve var

264500 
Segmentation fault

Sonra bana FATAL ERROR veren kod çalıştırdım: CALL_AND_RETRY_LAST Ayırma başarısız oldu - aynı --stack-size = 60000 parametresi ile bellek yetersiz işlemek ve yok Segmentation fault.

Sonuç CALL_AND_RETRY_LASTolarak özyineleme yığını boyutu ile ortak bir sonuç yoktur.

Bu sorunu nasıl çözebilirim? Bilgisayarımda bu görevi başarıyla tamamlamak için yeterli boş hafıza olduğuna inanıyorum.

Stackoverflow'da benzer sorular var, ancak bu soruların hiçbiri bu CALL_AND_RETRY_LASTyüzden ayrı bir soru yarattığımla ilgili değil.


3
Kodunuz Node.js 0.10.28 ile benim için iyi çalışıyor. 1200 MB sanal bellek aldı ve ekrana inanılmaz miktarda önemsiz baskı yaptı, ancak "çalışıyor" gibi görünüyordu.
John Zwinck

1
Önemsiz almak istediğim şey tam olarak bu. Kötü olan şey 0.10. * Düğümü uyum üreteçlerini desteklemediğinden bu amaçla kullanamam.
user619271 29:14

Yanıtlar:


112

Eğer kaynağa bir göz attıysanız : github / v8 , çok büyük bir nesneyi ayırmaya çalıştığınız anlaşılıyor. Deneyimlerime göre, büyük bir JSON nesnesini ayrıştırmaya çalışırsanız, ancak çıkışınızı ayrıştırmaya çalıştığımda olur. JSON ve node0.11.13, sadece iyi çalışıyor.

Daha fazlasına ihtiyacınız yok --stack-size, daha fazla belleğe ihtiyacınız var: --max_new_space_sizeve / veya --max_old_space_size.

Yanında verebileceğim tek ipucu başka bir JSON ayrıştırıcısını deniyor ve / veya giriş biçimini yalnızca JSON yerine JSON satırına değiştirmeye çalışıyor.


10
Çok teşekkür ederim! Tanımlama --max_old_space_size = 2000000 ki ~ 2GB benim sorunumu çözmüş demektir. Değişen --max_new_space_size hiç bir etkiye sahip görünmüyordu.
user619271

Ayrıca v8 kaynağına bir göz attım ama orada neler olduğunu anlamadım. Bu yüzden bunu sizin yardımınız olmadan çözme şansım muhtemelen sıfırdır. Tekrar teşekkür ederim.
user619271

1
@ theWanderer4865 "giriş biçimini yalnızca JSON yerine JSON satırına değiştirmeye çalışın" ile ne demek istiyorsunuz? Lütfen biraz açıklayabilir misiniz? Teşekkür ederim.
titusmagnus

16
@ user619271 --max_old_space_size = 2048 2GB
Zamansız

1
Haha .. @Timeless
technophyle

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

Projenizin kök konumundan çalıştırın:

$ increase-memory-limit

Bu araç, node_modules / .bin / * dosyalarınızın içindeki tüm düğüm çağrılarına --max-old-space-size = 4096 ekler.


Node.js sürümü> = 8 - DEPRECATION BİLDİRİMİ

NodeJs V8.0.0 olduğundan, seçeneği kullanmak mümkündür --max-old-space-size. NODE_OPTIONS = seçenekler ...

$ export NODE_OPTIONS=--max_old_space_size=4096

merhaba, @ sol-ibit. 4096 argümanı ne anlama geliyor?
estebanpdl

1
Merhaba @estebanpdl, Node.js uygulamanızı artırılmış bellekle çalıştırmanın çözümü, ek bir V8 bayrağıyla işleme başlamaktır: --max-old-space-size. İstediğiniz bellek boyutunu megabayt olarak eklemeniz gerekir. Aşağıdaki komut uygulamanızı 4 GB bellek sınırıyla başlatır.
sol404

1
Değişkeni ayarlamak export NODE_OPTIONS=--max_old_space_size=4096benim için hile yaptı! Teşekkürler!
Tarator

46

Bu sorunu çözmek için, seçeneği kullanarak bellek sınırını artırarak uygulamanızı çalıştırmanız gerekir --max_old_space_size. Varsayılan olarak Node.js'nin bellek sınırı 512 mb'dir.

node --max_old_space_size=2000  server.js 

5
Bunu nasıl yapacağınıza dair adım adım bir kılavuz var mı? Bu sadık kodu nereye yapıştırırım: node --max_old_space_size=2000 server.js
Bay Benedict

@ Mr.Benedict başvurunuzu başlattığınızda bunu yaparsınız.
easymoden00b

2
düğüm --max_old_space_size = 2048 server.js ... daha uygun ... teşekkürler çalışıyor
danday74

1
Google bulut üzerinde bir React uygulamam var. Bunu nasıl yapabilirim? Herkes rehberlik edebilir mi lütfen?
Shubham Kushwah

1
@ easymoden00b Daha node server.jsdoğrusu değil npm start. Bunu nasıl yapabilirim?
Shubham Kushwah

30

Bunun max_new_space_size4.1.1 düğümünde bir seçenek olmadığını buldum ve max_old_space_sizetek başıma sorunumu çözmedi. Benim shebang aşağıdaki ekliyorum ve bunların kombinasyonu işe yarıyor gibi görünüyor:

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

[EDIT]: 4096 === 4 GB bellek, cihazınızın belleği düşükse daha küçük bir miktar seçmek isteyebilirsiniz.

[UPDATE]: Daha önce şu şekilde çalıştırılan homurdanma çalışırken bu hatayı da keşfetti:

./node_modules/.bin/grunt

Komutu aşağıdakine güncelledikten sonra bellek hataları oluşmayı durdurdu:

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

4
--Max_old_space_size = 8192 ekledim, hala sorunu çözmedi ama bilgisayarımı
astım

Örnekte yer alan bellek miktarını 8Gb'den 4Gb'ye düşürdüm, geri bildirim için teşekkürler.
jfunk

28

Not: Bunun Elektron uygulamalarını nasıl etkileyebileceği hakkındaki yorumlarda verilen uyarıya bakın.

Ağustos 2017'de gönderilen v8.0 itibariyle, NODE_OPTIONS ortam değişkeni bu yapılandırmayı ortaya koymaktadır (bkz. NODE_OPTIONS 8.x'e indi! ). Makaleye göre, yalnızca kaynakta beyaz listeye eklenmiş seçeneklere (not: güncel bir bağlantı değil!) İzin verilir."--max_old_space_size" . Bu makalenin başlığı biraz yanıltıcı görünüyor - NODE_OPTIONS zaten varmış gibi görünüyor, ancak bu seçeneği açıkladığından emin değilim.

Bu yüzden benim koymak .bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


Uyarı kelimesi: bunu Windows makinenizde ortam değişkeni olarak ayarlamayın. Her şeyi kırar . GitKraken, Slack, VS2017 yükleyicisi (krom tabanlı), Azure ile ilgili VS2017 uzantıları ve hatta VS2017'deki "Uzantılar ve Güncellemeler" menü öğesini kırdı.
Roman Starkov

Github.com/electron/electron/issues/12695 adresine bir göz atın - Electron gibi görünüyor - ancak bu sorunu önlemek için NODE_OPTIONS özelliğini yalnızca belirli proje dizinlerinde smartcd kullanarak ayarladım github.com/cxreg / smartcd
Ben Creasy

Ah, bu muhtemelen Discord ve VS Code'un neden etkilenmediğini açıklıyor.
Roman Starkov

1
Bunu bir Windows makinesinde nasıl yapabilirim?
Mahmoud Ezzat

16

increase-memory-limitModül artık kullanımdan kaldırıldı. İtibariyle node.js v8.0 Ağustos 2017 sevk, şimdi kullanabilirsiniz NODE_OPTIONSayarlamak için env değişkeni max_old_space_sizeglobal olarak.

export NODE_OPTIONS=--max_old_space_size=4096

Referans URL'si: https://github.com/endel/increase-memory-limit


Bunu nereden ayarladın? Azure DevOps derlemesi kullanıyorum ve Windows ajanlarında derlemeler başarısız oluyor
int-i

Platformlar arası farkı önlemek için, cross-envmodülü global olarak takın ve terminalde bu komutla çalıştırıncross-env PORT=8000 node --max-old-space-size=4096 server.js
Ali Ali

Azure Devops yapıları buluttaki MS aracılarında çalıştırılır, bunları çalıştıracak konsol yoktur. Powershell kullanarak bunları başarmanın başka bir yolunu buldum. Buraya bir cevap olarak eklendi.
int-i

13

Yukarıdaki cevaplarda sadece bir varyasyon.

Yukarıdaki düz yukarı düğüm komutunu başarılı olmadan denedim, ancak bu Açısal CLI sorununun önerisi benim için çalıştı - sizde bir Düğüm komut dosyası oluşturursunuzpackage.json üretiminizi çalıştırdığınızda Düğüm için kullanılabilir belleği artırmak dosyanızda .

Düğüm için kullanılabilir belleği 4 gb'ye ( max-old-space-size=4096) yükseltmek istiyorsanız , Düğüm komutunuz olacaktır node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (ihtiyaçlarınıza bağlı olarak bellek miktarını artırın veya azaltın - 4gb benim için çalıştı, ancak daha fazla veya daha azına ihtiyacınız olabilir). Daha sonra paketinizi aşağıdaki gibi package.json 'komut dosyaları' bölümüne eklersiniz:

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

Kullanılabilir diğer komut dosyalarıyla birlikte komut dosyaları nesnesinin içinde bulunur - ör:

"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"
}

Ve çağırarak çalıştırıyorsunuz npm run prod(çalıştırmanız gerekebilirsudo npm run prod Mac veya Linux ).

Düğümün daha fazla belleğe ihtiyaç duymasına neden olan altta yatan bir sorun olabileceğini unutmayın - bu durum söz konusu olduğunda bunu ele almaz - ancak en azından Düğüme yapıyı gerçekleştirmek için gereken belleği verir.


6

Benim çalışma çözümüm:

  • Çapraz env yükleyin
    npm install --save-dev cross-envveyanpm install -g cross-env .
  • Dosya package.jsonyeni derleme komut dosyası ekleyin
    örn.
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • Bir dahaki sefere derlemek için bu komutu kullanın.
    npm run build:prod:ios

  • Sorun çözüldü.


1

Bu dosya ile birkaç gün kaybettim .... bazı dosyada bir statik dosya, yerleşik bir dosya ithal olduğunu bulana kadar. İnşa asla bitmez. Gibi bir şey:

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

Gerçek kaynağa sabitlemek tüm sorunu çözdü.

Çözümümü paylaşıyorum. :)


2
çözümünüzü biraz daha açıklayabilir misiniz? Aynı sorunu yaşıyorum ve benim uygulama çöküyor. Uygulamanın ilk birkaç dakikası boyunca her şey iyi çalışıyor, ancak sonunda belleğin tükenmesi nedeniyle çöküyor. Ancak bu dönemde Sequelize iyi çalışıyor.
Porlune

1
Ne oldu, benim IDE (WebStorm) otomatik olarak benim kaynakları üzerinde YAPILMIŞ js dahil olmasıdır ... bir dosya (benim kaynakları üzerinde) değiştirildiğinde, tüm dosyaları yeni bir js çıktı oluşturmak. Ancak, kaynaklarımda oluşturulmuş dosyalara referans varsa, hiçbir zaman oluşturmayı durdurmaz. Hangi dosyanın yanlış dosya içerdiğini kontrol edin.
Tiago Gouvêa

1

Bu sorunu yerel tepki göstermek için bir paket oluştururken görüyordum. Denediğim ve çalışmadığım şeyler:

  1. Artan node --max_old_space_size , ilginç bir şekilde bu benim için yerel olarak çalıştı ama jenkins başarısız oldu ve hala jenkins neyin yanlış gittiğinden emin değilim
  2. Düğüm versiyonunu 6.9.1'e düşürdüğü belirtilen bazı yerler de benim için işe yaramadı. Bunu buraya koymak istiyorum, çünkü sizin için işe yarayabilir.

Benim için işe yarayan şey: Kodda gerçekten büyük bir dosya alıyordum. Çözdüğüm yol, ignorelistede .babelrcböyle bir şeye dahil ederek oldu :

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

Bu .jsgerçekten aktarılması gereken bir dosyaydı ve yoksayma listesine eklemek yardımcı oldu.


1

Bu hata, yürütme için ayrılan bellek, çalışan işlem için gereken bellekten daha az olduğunda oluşur. Varsayılan olarak, bu düğümü artırmak için Düğüm bellek boyutu 512 mb'dir: Aşağıdaki komutu yazmanız gerekir:

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

1
buradaki dosya adı nedir?
Rashedul.Rubel

1

İyonik olarak bu sorunla karşı karşıya kaldım ve birçok çözüm denedim ama bunu çalıştırarak çözdüm.

MAC için: düğüm --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Windows için: düğüm --max-old-space-size = 4096 / Kullanıcılar / {kullanıcınız} / AppData / Dolaşım / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

artış hafızalı sınırı

VEYA

  1. % Appdata% -> npm klasörüne gidin veya C:\Users\{user_name}\AppData\Roaming\npm
  2. En sevdiğiniz düzenleyicide ng.cmd dosyasını açın
  3. Ekle --max_old_space_size=8192için IFve ELSEbloğun

Şimdi ng.cmd dosyası değişiklikten sonra şöyle görünüyor:

@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

Windows Machine'de aşağıdaki komutu çalıştırın

NODE_OPTIONS = - max_old_space_size = 4096 değerini ayarla


0

Alternatif bir çözüm, AOT derleyicisini devre dışı bırakmaktır:

ng build --prod --aot false

1
Neden yanlış olduğunu açıklayabilir misin?
Codebrekers

0

Azure derleme boru hatlarında bu hatayı alan herkes, derleme aracısının ortam değişkenini değiştirmek için aşağıdaki adımı deneyin

Aşağıdaki ayarlarla derlemeden önce bir Azure build pipeline task-> ekleyinAzure powershell script:Inlinescript

- 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 düğümü - ionic-app-scripts.js dint çalışmalarında max-old-space-size = 4096

Ancak Değiştirdikten sonra: aşağıdaki dosya çalıştı

node_modules / Bin / iyonik uygulama-scripts.cmd

Toplayarak:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.