JavaScript は、その汎用性により、最も使用されているプログラミング言語の 1 つです。 ブラウザー環境外で JavaScript を実行するには、開発者はクロスプラットフォームのランタイム環境である Node.js をインストールする必要があります。
JavaScript Node.js プロジェクトの実行時に、JavaScript ヒープ不足エラーがよく発生します。
JavaScript ヒープ メモリ不足の問題は、コンピューター システムによって割り当てられた既定のメモリが、大きなプロジェクトを実行するには不十分な場合に発生するエラーです。
メモリ不足エラーが発生すると、プログラムがクラッシュし、この出力が表示されます。
致命的なエラー: CALL_AND_RETRY_LAST 割り当てに失敗しました – JavaScript ヒープがメモリ不足です
また
致命的なエラー: 無効なテーブル サイズの割り当てに失敗しました – javascript ヒープがメモリ不足です
JavaScript ヒープ不足エラーの原因
- 大規模なデータ構造の存在: 行列や配列などの大規模なデータ構造を操作すると、多くのスペースが消費され、最終的にヒープ不足のメモリ エラーが発生する可能性があります。
これは、10 億の要素を持つ大規模なデータ構造の例です。
let array = []; for (let i = 0; i < 1000000000; i++) { array.push(i); }
- 貧弱なメモリ管理: アプリケーションが大きくなるにつれて、不要になったオブジェクトを手放す必要があります。
これは、メモリ リークにつながる関数の例です。
let array = []; setInterval(function() { array.push(new Array(1000000).join("x")); }, 1000);
- 無限ループ: このようなコードは、終了条件に達することがないため、永久に実行されます。
これは永久に実行される無限ループの例です。
while (true) { console.log(1); }
無限ループはメモリを非常に高速に使用するため、このエラーにつながる可能性があります。
- 再帰関数: 再帰関数は、特定の条件が満たされるまで特定の命令セットを繰り返すために、間接的または直接的にそれ自体を呼び出す関数です。 これらの関数が適切に設計されている場合、メモリ リードが発生し、最終的にはヒープ オブ メモリ エラーが発生する可能性があります。
- コードの一部に多数のオブジェクトが存在する: コードに多数の大きなオブジェクトが含まれている場合、それらのオブジェクトがまとめてメモリを使い果たすと、オーバーロードが発生する可能性があります。
JS ヒープのメモリ不足エラーを修正
このエラーは、Windows、macOS、および Ubuntu などの Linux ベースのオペレーティング システムで発生する可能性があります。 幸いなことに、オペレーティング システムに関係なく、エラーは修正可能です。
#1。 Windows OS での JavaScript ヒープ不足エラーの修正
ステップ 1:[スタート]メニューをクリックして、[システムの詳細設定]を見つけます。
ステップ 2: ダイアログ ボックスの左下にある[環境変数]をクリックします。
ステップ 3: ユーザー変数またはシステム変数のいずれかで[新規]をクリックします。 最初のオプションは、変更を現在のユーザー アカウントに適用します。 ただし、2 番目のオプションは変更をシステム全体に適用します。
ステップ 4: 2 つのオプションが表示されます。 変数名に NODE_OPTIONS と入力し、変数値に –max-old-space-size=4096 と入力します。 このステップでは、4096 という数字が 4 GB の仮想メモリを Node.js に割り当てます。 値を –max-old-space-size=8192 に設定することで、8GB などのより多くを割り当てることができます。
ステップ 5:[OK]をクリックして適用し、最後に[OK]をクリックして変更を保存します。
Windows PowerShell ターミナルを使用してエラーを解決することもできます。 Windows OS でターミナルを開き、次のコマンドを入力します。
env:NODE_OPTIONS="--max-old-space-size=4096"
アプリを実行する前にこのコマンドを実行して、エラーを一時的に解決することもできます。
set NODE_OPTIONS=--max-old-space-size=4096
#2。 Linux での JavaScript ヒープのメモリ不足エラーの修正
- ステップ 1: エラーの原因を特定します。 コンソール ログまたは出力を確認して、エラーの原因となっているコード/ファイルの行を特定します。
- ステップ 2: Node.js に割り当てた仮想メモリを指定する環境変数をエクスポートします。 このコマンドを使用します。
export NODE_OPTIONS=--max-old-space-size=4096
これらの手順により、4 GB の仮想メモリが Node.js に割り当てられます。 それでもエラーが続く場合は、メモリ サイズを 2 倍にして増やすことができます。
たとえば、仮想メモリとして 8GB を割り当てたい場合は、次のコマンドを実行できます。
export NODE_OPTIONS=--max-old-space-size=8192
#3。 macOS での JavaScript ヒープ不足エラーの修正
Linux と同様のアプローチを使用して、macOS の JavaScript ヒープのメモリ不足エラーを解決できます。 次の手順を実行します;
- ステップ 1: コンソール ログまたは出力をチェックして、エラーの原因となっているコード/ファイルの行を特定することにより、エラーの原因を特定します。
- ステップ 2: Node.js に割り当てた仮想メモリを指定する環境変数をエクスポートします。 このコマンドを使用します。
export NODE_OPTIONS=--max-old-space-size=4096
これらの手順により、4 GB の仮想メモリが Node.js に割り当てられます。 それでもエラーが続く場合は、メモリ サイズを 2 倍にして増やすことができます。
たとえば、仮想メモリとして 8GB を割り当てたい場合は、次のコマンドを実行できます。
export NODE_OPTIONS=--max-old-space-size=8192
NPM インストール中のメモリの増加
これまでに提供したソリューションは、Node.js アプリケーションの実行時に発生するエラーに適しています。 ただし、JavaScript パッケージをインストールするときに仮想メモリを割り当てて、ヒープ不足のメモリ エラーを解決することができます。 このコマンドを使用します。
node --max-old-space-size=4096 (which npm) install
注: 仮想メモリの割り当てを 1GB、2GB、3GB、または 4GB ずつ増やし続けることができます。 メモリ サイズを MB 単位で指定する必要があります。 ただし、プログラムがクラッシュする可能性があるため、マシンのメモリ全体を Node.js に割り当てないでください。 マシンの容量が 16 GB の場合、最大 8 GB を Node.js に割り当てることができます。
JavaScript のヒープ不足エラーを防止する
これまで、JavaScript ヒープのメモリ不足エラーが発生した場合の修正方法について説明しました。 幸いなことに、JavaScript コードを実行するときにこのエラーが発生しないようにする手段も用意されています。 これらは最良のアプローチの一部です。
#1。 データを小さなチャンクに分割する
大規模な CSV ファイルから大規模なデータセットを ETL: 抽出 – 変換 – ロード プロセスを通じてインポートする Node.js プログラムを使用している場合があります。 データをインポートしようとすると、アプリが常にクラッシュすることがあります。 MongoDB を使用している場合は、次のようなコマンド ライン命令を使用してエラーを解決できます。
split -l 1000000 users.csv
このコマンドは、users という名前のファイルを、それぞれ 1000000 ユーザーの複数のファイルに分割するよう Node.js に指示します。 -l フラグは、コードの行数に基づいてファイルを分割する必要があることを指定します。
#2。 メモリ使用量を監視する
メモリ プロファイラーを使用して、コード内のメモリ リークを検出できます。 これを実現するために、Node.js の組み込みメモリと ChromeDevTools を組み合わせることができます。 この 2 つは、コードの問題を検出して修正できます。
Datadog、New Relic、AppDynamics などの外部ツールを使用して、アプリのパフォーマンスを監視し、必要なアクションを実行することもできます。 process.memoryUsage() メソッドを使用して、Node.js アプリのメモリ使用量を確認することもできます。
#3。 メモリリークの回避
Node.js アプリが不要になったオブジェクトへの参照を保持している場合、メモリ リークが発生します。 このようなオブジェクトがガベージ コレクションされていない場合、時間の経過とともにメモリ使用量が増加します。
メモリ リークを回避するには、コード内でグローバル変数を使用しない、I/O 操作のブロックを回避する、var の代わりに変数を宣言するときに let キーワードと const キーワードを使用するなど、いくつかの方法があります。
#4。 産卵プロセス
Raspberry Pi などのメモリが限られているマシンで Node.js を実行している場合、ヒープ不足のメモリ エラーが発生する可能性があります。 1 つのマスター プロセスを持つことができ、他のプロセスはワーカーとしてグループ化されます。 マスター プロセスは、システムのメモリが不足していることを検出するとすぐに、そのプロセスを強制終了し、過負荷になっていない別のプロセスにタスクを割り当てます。
#5。 ハードウェアの更新
メモリ割り当てを増やし、ヒープ不足エラーを防止するリストされたプロセスを実行しても問題が解決しない場合は、ハードウェアの更新を検討してください。 Node.js は 512MB の RAM で実行できます。 ただし、アプリが大きくなるにつれて、より多くの RAM が必要になります。
一方、CPU の数を増やすと、メモリ割り当てを改善することもできます。 理想的には、2 つ以上の CPU を使用して、アプリケーションが暗号化や画像処理などの CPU 集中型タスクにワーカー スレッドを使用できるようにします。
よくある質問
JavaScript Heap Out of Memory エラーの原因は何ですか?
このエラーは、いくつかの理由で発生する可能性があります。
1.メモリリーク
2.無限ループ
3. プロジェクト内の多数のオブジェクトの存在
4. 大規模なデータ構造の存在
JavaScript Heap Out of Memory エラーは解決可能ですか?
はい。 次の方法でエラーを解決できます。
1. Node.js により多くの仮想メモリを割り当てる
2. メモリリークをなくす
3. コードの最適化
4. ハードウェアのアップグレード
React アプリで Heap Out of Memory エラーを解決するにはどうすればよいですか?
React は、最も人気のある JavaScript ライブラリの 1 つです。 ルート ディレクトリで package.json ファイルを見つけ、これらの行をスクリプト セクションに移動します。
"scripts": { "start": "react-scripts --max_old_space_size=4096 start", "build": "react-scripts --max_old_space_size=4096 build", "test": "react-scripts test", "eject": "react-scripts eject" }
まとめ
ほとんどの開発者は、Node.js プログラムを実行する際に、実行時エラーではなく、バグやコード エラーに慣れています。 幸いなことに、メモリ不足のヒープ エラーは修正可能であるため、心配する必要はありません。 JavaScript ヒープ メモリ不足エラーとは何かを定義し、それを解決する方法と、次の Node.js プロジェクトでそれを回避する方法を説明しました。
次に、いくつかの一般的な JavaScript エラーを回避する方法もお読みください。