環境変数を設定してもJavaScript heap out of memoryが再発する理由
はじめに
開発中のプロジェクトで npm start を実行した際に「JavaScript heap out of memory」エラーが発生しました。一度は解決したと思っていたのですが、再び同じエラーが発生してしまいました。今回は根本的な解決方法を見つけたので、その経緯と解決策を共有します。
問題
npm satrt を実行すると、以下のようなエラーが発生しました:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
このエラーは、Node.jsのヒープメモリが不足した際に発生する典型的なエラーです。
解決方法
エラーの詳細な原因調査はしていませんが、先駆者たちが残してくれた記事を参考に、
メモリ制限を増やす方法を試してみました。
一時的な解決策
プロジェクトのルートディレクトリで以下の設定を試しました:
export NODE_OPTIONS="--max-old-space-size=8192"
この設定後、npm start を実行すると一時的にはエラーが解消されました。
なぜ再発したのか
プロジェクトのルートディレクトリで設定した環境変数が、
ターミナルセッションの終了と共にリセットされていたことが原因でした。
ターミナルの仕組み
- ターミナルを開く = 新しいプロセス(実行中のプログラム)が起動する
- 各ターミナルは独立したプロセスなので、それぞれ独自の環境変数を持つ
- 環境変数の設定は、そのプロセス内でのみ有効
- ターミナルを閉じる → プロセス終了 → そのプロセス内の設定は消失
- 新しいタブ・新しいターミナル → 別の新しいプロセス → 前の設定は引き継がれない
つまり、プロジェクトルートでの export NODE_OPTIONS="--max-old-space-size=8192"は、
そのターミナルセッション内でのみ有効で、次回開発時には設定が消えていたということです。
根本的な解決策
.bashrc または .zshrc ファイルに以下の設定を追加しました:
export NODE_OPTIONS="--max-old-space-size=8192"
設定後、ターミナルを再起動するか以下のコマンドで設定を反映:
source ~/.bashrc # または source ~/.zshrc
なぜ解決するのか
- 新しいシェルセッション開始時に自動で設定が読み込まれる
- ターミナルを閉じても設定が永続化される
- どのプロジェクトディレクトリからでも一貫して適用される
結果、npm start が正常に動作するようになりました。
終わりに
一時的な対処ではなく、ターミナルの仕組みを理解した上での根本的な解決により、安定して動作するようになりました。環境変数はプロセス毎に独立しており、ターミナルセッションが終了すると消失するという基本的な仕組みを理解することが重要でした。同じ問題で困っている方の参考になれば幸いです。
Discussion