web-dev-qa-db-ja.com

Node.jsがメモリ不足になる

今日私はRAIDファイルのインデックスを更新するためにファイルシステムのインデックスを作成するために私のスクリプトを実行し、4時間後に次のエラーでクラッシュしました:

[md5:]  241613/241627 97.5%  
[md5:]  241614/241627 97.5%  
[md5:]  241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)

<--- Last few GCs --->

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n  >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/bin/node]
 2: 0xe2c5fc [/usr/bin/node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
 6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
 7: 0x3629ef50961b

サーバーには16 GB RAMおよび24 GB SSDスワップが装備されています。私のスクリプトが36ギガバイトのメモリを超えたことには疑いがありません。少なくともそれはいけません

スクリプトは、ファイルのメタデータ(変更日、権限など、ビッグデータなし)を持つオブジェクトの配列として格納されているファイルのインデックスを作成します。

これは完全なスクリプトコードです: http://Pastebin.com/mjaD76c3

私は過去にこのスクリプトで奇妙なノードの問題をすでに経験しています。 Stringのような大きなファイルを処理するときにノードがグリッチしていたので、インデックスを複数のファイルに分割しました。巨大なデータセットでnodejのメモリ管理を改善する方法はありますか?

142
Lapsio

私の記憶が正しければ、V8のメモリー使用量には、手動で増やさないのであれば、約1.7 GBという厳密な標準制限があります。

当社の製品の1つでは、デプロイスクリプトでこのソリューションに従いました。

 node --max-old-space-size=4096 yourFile.js

ここで私が読んだように、新しいspaceコマンドもあるでしょう: ツアーv8ガベージコレクション 新しいスペースは新しく作成された短期データのみを集め、古いスペースはすべての参照されたデータ構造を含みますあなたの場合はこれが最善の選択肢であるはずです。

192
Felix

万が一誰かが直接ノードのプロパティを設定できない環境でこれに遭遇した場合(私の場合はビルドツール):

NODE_OPTIONS="--max-old-space-size=4096" node ...

コマンドラインで渡すことができない場合は、環境変数を使用してノードオプションを設定できます。

22
Kamiel Wanrooij

私はVSCodeでデバッグしようとしたときにこの問題に遭遇したので、単にこれを追加したいのはあなたがあなたのデバッグ設定に引数を追加する方法です。

あなたはそれをlaunch.jsonのあなたの設定のruntimeArgsプロパティに追加することができます。

下記の例をご覧ください。

{
"version": "0.2.0",
"configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceRoot}\\server.js"
    },
    {
        "type": "node",
        "request": "launch",
        "name": "Launch Training Script",
        "program": "${workspaceRoot}\\training-script.js",
        "runtimeArgs": [
            "--max-old-space-size=4096"
        ]
    }
]}
20
Astr-o

単一のスクリプトだけでなく、ノードのメモリ使用量をグローバルに増やす場合は、次のように環境変数をエクスポートできます。
export NODE_OPTIONS=--max_old_space_size=4096

そうすれば、npm run buildのようなビルドを実行するときにファイルを操作する必要がなくなります。

16
Maksim Luzik

私は--max-old-space-sizeを設定した後でもこれに苦労していました。

それから私はカルマスクリプトの前にオプション--max-old-space-sizeを置く必要性を実感しました。

私のスクリプトkarmaのために--max-old-space-sizeと--max_old_space_sizeの両方の構文を指定するのが最も良い:

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192  --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192   --prod --aot

参照 https://github.com/angular/angular-cli/issues/1652

12
duchuy

fwiw、 memwatch のようなものを使ってメモリを独占的に見つけ、修正することで解決するかもしれません。

9
NathanQ

修正する手順 -

  1. コマンドプロンプトを開き、%appdata%と入力してEnterキーを押します。
  2. %appdata%> npmフォルダに移動します
  3. お気に入りのエディタでng.cmdを開くか編集します
  4. IFブロックとELSEブロックに--max_old_space_size=8192を追加します

変更後のnode.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" %*
)
6
Umang Patwa

AOTアングルビルドをしている間に私は同様の問題を抱えていました。以下のコマンドが役に立ちました。

npm install -g increase-memory-limit
increase-memory-limit

出典: https://geeklearning.io/angular- aot-webpack-memory-trick/

6
Chandru

ノードサーバの起動時にメモリを増やす方法に関する追加情報を追加するためのフラグ値をいくつか示します。

1GB - 8GB

#increase to 1gb
node --max-old-space-size=1024 index.js

#increase to 2gb
node --max-old-space-size=2048 index.js 

#increase to 3gb
node --max-old-space-size=3072 index.js

#increase to 4gb
node --max-old-space-size=4096 index.js

#increase to 5gb
node --max-old-space-size=5120 index.js

#increase to 6gb
node --max-old-space-size=6144 index.js

#increase to 7gb
node --max-old-space-size=7168 index.js

#increase to 8gb 
node --max-old-space-size=8192 index.js 

6
Nicholas Porter

nODE_OPTIONS = --max-old-space-size = 8192を試しました。

私のためにうまく働いています。

1つの提案:-

ターミナルでconsole.log()にコメントしようとしました。それもメモリを消費するからです。そして使用

2
Amar Powar

ノードを最新バージョンにアップグレードしてください。私はこのエラーでノード6.6にいて8.9.4にアップグレードして問題は解決しました。

1
Richard Frank

私は最近この同じ問題に直面し、このスレッドに出くわしましたが、私の問題はReact Appにありました。 node startコマンドの以下の変更により、問題が解決しました。

構文

node --max-old-space-size=<size> path-to/fileName.js

node --max-old-space-size=16000 scripts/build.js

Max-old-space-sizeでサイズが16000になるのはなぜですか?

基本的に、そのスレッドに割り当てられたメモリとノード設定によって異なります。

正しいサイズを確認して与える方法は?

これは基本的にエンジンv8にとどまります。以下のコードは、ローカルノードv8エンジンのヒープサイズを理解するのに役立ちます。

const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);
1
Venkat.R

念のため、大量のログを生成するnodejsアプリケーションを使用しているときにこの問題を抱えている人々を助けることができるかもしれないので、同僚は標準出力をファイルにパイプすることによってこの問題を解決しました。

0
Adrien Joly

プロジェクトディレクトリのwindows open powershellまたはcmdのヒープメモリを1 - 8 GBから増やし、そのディレクトリのmac open terminalの場合は、下記のコマンドを入力します。

node --max-old-space-size={size in MBs} index.js
0
AB'

私が試してみました ????以下のコードとその正常動作.

  • プロジェクトルートディレクトリからターミナルを開く
  • cmdを実行して新しいサイズを設定してください。

    set NODE_OPTIONS = - max_old_space_size = 8172

またはあなたはより多くの情報のためにリンクをチェックすることができます https://github.com/nodejs/node/issues/10137#issuecomment-487255987

0
rkumar1904

私の場合、以前のバージョンのnodeでnpm installを実行していましたが、しばらくしていくつかのモジュールのためにnode versionとram npm installをアップグレードしました。この後私はこのエラーを受けていました。この問題を解決するために、各プロジェクトからnode_moduleフォルダーを削除し、再度npm installを実行しました。

これで問題が解決することを願っています。

注:これは私のローカルマシンで起こっていて、ローカルマシンだけで解決されました。

0
Gampesh

node自体ではなく、他のソフト、たとえばwebpackを起動しようとしている場合は、環境変数とcross-envパッケージを使用できます。

$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
  webpack --progress --config build/webpack.config.dev.js
0
Piterden