致命的なエラー:CALL_AND_RETRY_LAST割り当てに失敗しました-メモリ不足のプロセス


187

ノードのバージョンは v0.11.13

sudo topレイズオーバーによらないクラッシュ時のメモリ使用量3%

このエラーを再現するコード:

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

再帰スタックサイズの問題であるかどうかを確認するには、次のコードを--stack-size = 60000パラメーターで実行しました

var depth = 0;

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

そして持っている

264500 
Segmentation fault

次に、致命的なエラーが発生するコードを実行しました:CALL_AND_RETRY_LAST割り当てに失敗しました-同じ--stack-size = 60000パラメータを使用してメモリ不足のプロセスを実行しましたが、取得できませんでしたSegmentation fault。

だから私CALL_AND_RETRY_LASTは再帰スタックサイズと共通することは何もないと結論付けます。

どうすればこの問題を解決できますか?このタスクを正常に完了するには、コンピューターに十分な空きメモリがあると思います。

stackoverflowにも同様の質問がありますが、この質問のどれもがそうではないCALL_AND_RETRY_LASTので、別の質問を作成しました。


3
Node.js 0.10.28を使用すると、コードが正常に機能します。1200 MBの仮想メモリを使用し、信じられないほどの量のジャンクを画面に出力しましたが、「動作する」ように見えました。
— John Zwinck 2014

1
ジャンクはまさに​​私が欲しかったものです。悪いことに、ノード0.10。*はハーモニージェネレーターをサポートしていないため、この目的には使用できません。
— user619271 14

回答:


112

ソース:github / v8を見ると、非常に大きなオブジェクトを予約しようとしているようです。私の経験によれば、巨大なJSONオブジェクトを解析しようとすると発生しますが、出力を解析しようとするとJSONとnode0.11.13、それは正常に動作します。

--stack-sizeより多くのメモリは必要ありません、より多くのメモリが必要です:--max_new_space_sizeおよび/または--max_old_space_size。

私があなたに与えることができる唯一のヒントは、別のJSONパーサーを試すこと、および/または入力形式をJSONだけではなくJSON行に変更することです。


10
どうもありがとうございました!--max_old_space_size = 2000000を定義すると、〜2GBで問題が解決したと思います。--max_new_space_sizeを変更しても、まったく効果がないようです。
— user619271 14

私はv8ソースも調べましたが、そこで何が起こっているのかまったく理解できませんでした。だからあなたの助けなしでこれを解決する私のチャンスはおそらくゼロになる傾向があります。もう一度ありがとうございます。
— user619271 14

1
@ theWanderer4865「入力フォーマットをJSONだけではなくJSON行に変更してみてください」とはどういう意味ですか?詳しく説明してもらえますか?ありがとうございました。
— titusmagnus 2015

16
@ user619271 --max_old_space_size = 2048 2GBです
— タイムレス

1
はは.. @Timeless
— テクノ

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

プロジェクトのルートロケーションから実行します。

$ increase-memory-limit

このツールは、node_modules / .bin / *ファイル内のすべてのノード呼び出しに--max-old-space-size = 4096を追加します。


Node.jsバージョン> = 8-サポート終了のお知らせ

NodeJs V8.0.0以降、オプションを使用することが可能--max-old-space-sizeです。NODE_OPTIONS =オプション...

$ export NODE_OPTIONS=--max_old_space_size=4096

こんにちは、@ sol-ibit。4096引数はどういう意味ですか?
— estebanpdl 2018

1
こんにちは@estebanpdl、メモリを増やしてNode.jsアプリを実行するソリューションは、追加のV8フラグ--max-old-space-sizeでプロセスを開始することです。必要なメモリサイズをメガバイト単位で追加する必要があります。次のコマンドは、4 GBのメモリ制限でアプリケーションを起動します。
— sol404 2018

1
変数を設定するのexport NODE_OPTIONS=--max_old_space_size=4096は私にとってはトリックでした!ありがとう!
— タレーター

46

この問題を解決するには、オプションを使用してメモリ制限を増やし、アプリケーションを実行する必要があります--max_old_space_size。デフォルトでは、Node.jsのメモリ制限は512 MBです。

node --max_old_space_size=2000  server.js 

5
これを行う方法の段階的なガイドはありますか?私は、この忠実なコードをどこを貼り付けます: node --max_old_space_size=2000 server.js
— 氏ベネディクト

@ Mr.Benedictは、アプリケーションを起動するときにこれを行います。
— easymoden00b 2017

2
node --max_old_space_size = 2048 server.js ...の方が適切です...感謝します
— danday74

1
GoogleクラウドにReactアプリがあります。これどうやってするの?どなたかご案内頂けますか?
— Shubham Kushwah

1
@ easymoden00b node server.jsではなく、ではありませんnpm start。これどうやってするの?
— Shubham Kushwah

30

これmax_new_space_sizeはノード4.1.1のオプションではなく、それmax_old_space_sizeだけでは問題を解決できませんでした。私は私のシバンに以下を追加しています、そしてこれらの組み合わせはうまくいくようです:

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

[編集]:4096 === 4GBのメモリ。デバイスのメモリが不足している場合は、より少ない量を選択することをお勧めします。

[更新]:以前に次のように実行されたgruntの実行中にもこのエラーを発見しました:

./node_modules/.bin/grunt

コマンドを次のように更新すると、メモリエラーが発生しなくなりました。

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

4
--max_old_space_size = 8192を追加しましたが、それでも問題は解決しませんでしたが、私のPCがハングしました:(
— Dhyey

フィードバックのおかげで、サンプルのメモリ量を8Gbから4Gbに減らしました。
— jfunk

28

注:これがElectronアプリケーションにどのように影響するかについてのコメントの警告を参照してください。

2017年8月に出荷されたv8.0の時点で、NODE_OPTIONS環境変数はこの構成を公開しています(NODE_OPTIONSが8.xに導入されたのをご覧ください!)。記事によれば、ソースにホワイトリストに登録されているオプション(注:最新のリンクではありません!)のみが許可され、これにはが含まれ"--max_old_space_size"ます。この記事のタイトルは少し誤解を招くようです-NODE_OPTIONSはすでに存在していたようですが、このオプションが公開されているかどうかはわかりません。

だから私は私の中に入れました.bashrc:
export NODE_OPTIONS=--max_old_space_size=4096


警告:Windowsマシンでは、これを環境変数として設定しないでください。それはすべてを壊します。GitKraken、Slack、VS2017インストーラー(これはクロムベース)、Azure関連のVS2017拡張機能、さらにはVS2017の[拡張機能と更新]メニュー項目さえも壊しました。
— Roman Starkov

github.com/electron/electron/issues/12695を見てください。Electronは2.0.3のNODE_OPTIONSからクラッシュしないようですが、この問題を回避するために、特定のプロジェクトディレクトリでのみsmartcdを使用してNODE_OPTIONSを設定していますgithub.com/cxreg / smartcd
— Ben Creasy

ああ、それはおそらくDiscordとVS Codeが影響を受けなかった理由を説明しています。
— ローマスターコフ2018

1
Windowsマシンでそれを行う方法?
— Mahmoud Ezzat

16

increase-memory-limitモジュールは現在廃止されました。以下のようNode.jsのv8.0に 2017年8月に出荷、私たちは今、使用することができますNODE_OPTIONS設定したenv変数をmax_old_space_sizeグローバル。

export NODE_OPTIONS=--max_old_space_size=4096

参照URL:https : //github.com/endel/increase-memory-limit


これはどこに設定しますか?Azure DevOpsビルドを使用していますが、Windowsエージェントでビルドが失敗します
— int-i

クロスプラットフォームの違いを回避するには、cross-envモジュールをグローバルにインストールし、次のコマンドを使用してターミナルで実行しますcross-env PORT=8000 node --max-old-space-size=4096 server.js
— Ali David

Azure Devopsビルドはクラウド上のMSエージェントで実行され、それらを実行するコンソールはありません。PowerShellを使用してこれらを実現する別の方法を見つけました。ここに回答として追加しました。
— int-i

13

上記の答えのバリエーションです。

上記のまっすぐなnodeコマンドを試してみましたが成功しませんでしたが、このAngular CLIの問題からの提案はうまくいきました。package.jsonファイルにNodeスクリプトを作成して、本番ビルドを実行するときにNodeが利用できるメモリを増やします。

したがって、Nodeで利用可能なメモリを4GB(max-old-space-size=4096)に増やしたい場合、Nodeコマンドはになりますnode --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod。(あなたのニーズに応じてメモリの量を増やしたり減らしたりします-私には4GBがうまくいきましたが、必要な量は増減するかもしれません)。次に、次のようにpackage.jsonの「scripts」セクションに追加します。

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

利用可能な他のスクリプトと一緒にスクリプトオブジェクトに含まれます-例:

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

そして、それを呼び出して実行しますnpm run prod(sudo npm run prodMacまたはLinuxの場合は実行する必要がある場合があります)。

Nodeがより多くのメモリを必要とする根本的な問題がある可能性があることに注意してください-これはその場合には対処しません-少なくともNodeにビルドを実行するために必要なメモリを与えます。


6

私の実用的な解決策は:

  • cross-env
    npm install --save-dev cross-envまたはをインストールしますnpm install -g cross-env。
  • ファイルには、package.json新しいビルドスクリプトの追加
    などを
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • そのコマンドを使用して、次回ビルドします。
    npm run build:prod:ios

  • 問題が解決しました。


1

私はこの問題で数日を失った....あるファイルで、1つの静的ファイル、つまりビルドされたファイルをインポートしていることがわかるまで。それはビルドを決して終わらせないようにします。何かのようなもの:

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

実際のソースに修正すると、すべての問題が解決しました。

私のソリューションを共有しています。:)


2
あなたの解決策についてもう少し説明してもらえますか?これと同じ問題が発生し、アプリケーションがクラッシュします。アプリの最初の数分間はすべてが正常に機能しますが、最終的にメモリ不足でクラッシュします。しかし、その間、Sequelizeは正常に動作します。
— Porlune 2017年

1
何が起こったのかというと、私のIDE(WebStorm)は、ビルドされたjsをソースに自動的に含めました... 1つのファイル(私のソース)が変更されると、すべてのファイルが新しいjs出力に組み込まれます。しかし、私のソースにビルドされたファイルへの参照がある場合、ビルドが停止することはありません。不正なファイルが含まれているファイルを確認します。
— TiagoGouvêa2017年

1

反応ネイティブのバンドルを作成しているときにこの問題が発生していました。私が試したがうまくいかなかったもの:

  1. を増やすとnode --max_old_space_size、これは私にとってローカルで機能しましたが、ジェンキンスで失敗しましたが、ジェンキンスで何がうまくいかないのかまだわかりません
  2. ノードのバージョンを6.9.1にダウングレードすると記載されている場所もあり、それも私にとってはうまくいきませんでした。それはあなたのために働くかもしれないので、私はこれをここに置きたいと思います。

私にとってうまくいったこと:コードに非常に大きなファイルをインポートしていた。私がそれを解決した方法は、それignoreを.babelrc次のようなもののリストに含めることによるものでした:

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

これは、.jsトランスパイルを実際に必要としないファイルであり、無視リストに追加すると役に立ちました。


1

このエラーは、実行に割り当てられた必要なメモリが、実行中のプロセスに必要なメモリより少ない場合に発生します。デフォルトでは、ノードのメモリサイズは512 MBで、これを増やすには、次のコマンドを入力する必要があります。

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

1
ここのファイル名は何ですか?
— Rashedul.Rubel

1

私はイオンでこの問題に直面していて、多くの解決策を試しましたが、これを実行することでこれを解決しました。

MACの場合: node --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Windowsの場合: node --max-old-space-size = 4096 / Users / {your user} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

メモリ制限の増加

または

  1. %appdata%-> npmフォルダに移動するか、 C:\Users\{user_name}\AppData\Roaming\npm
  2. お気に入りのエディターでng.cmdを開きます
  3. 追加--max_old_space_size=8192するIFとELSEブロック

今ng.cmdファイルには、変更後に次のようになります。

@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" %*
)



0

Azureビルドパイプラインでこのエラーが発生した場合は、以下の手順を試してビルドエージェントの環境変数を変更してください

以下の設定でコンパイルする前にAzure build pipeline task-> を追加しAzure 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 node --max-old-space-size = 4096 ionic-app-scripts.js dint work内

しかし、変更後:次のファイルは機能しました

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

追加することにより:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.