背景
viteで開発中にたまにこの「JavaScript heap out of memory」のエラーになり、落ちることがあった為調査しています。
built in 15152ms.
[vite-plugin-static-copy] Copied 1 items.
build started...
<--- Last few GCs --->
[1764:0x120040000] 1724578 ms: Scavenge (reduce) 3845.4 (3929.1) -> 3845.0 (3929.4) MB, 2.3 / 0.0 ms (average mu = 0.076, current mu = 0.019) allocation failure;
[1764:0x120040000] 1724582 ms: Scavenge (reduce) 3845.7 (3929.4) -> 3845.2 (3929.9) MB, 3.2 / 0.0 ms (average mu = 0.076, current mu = 0.019) allocation failure;
[1764:0x120040000] 1724587 ms: Scavenge (reduce) 3845.9 (3929.9) -> 3845.5 (3929.9) MB, 3.6 / 0.0 ms (average mu = 0.076, current mu = 0.019) allocation failure;
<--- JS stacktrace --->
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
Viteのissue
こちらで紹介された回避策で以下が紹介されていました
node --max_old_space_size=16384 vite build
--max_old_space_sizeについて調べます。
--max-old-space-sizeとは
V8の古い世代のメモリセクションの最大メモリサイズを設定する為のオプションです。
メモリ消費量が上限に近づくと、V8は未使用メモリを解放するためにガベージコレクションに多くの時間を費やします。
2GiBのメモリを持つマシンの場合
これを1536(1.5GiB)に設定することで、他の用途にメモリを残し、スワップを回避することができます。
他の用途のためにメモリを残してスワップを避けるために、この値を1536(1.5GiB)に設定することを検討してください。
〜ガーベッジコレクション〜
コンピュータプログラムの実行環境などが備える機能の一つで、実行中のプログラムが占有していたメモリ領域のうち不要になったものを自動的に解放し、空き領域として再利用できるようにするもの
ガベージコレクション
〜スワップ(スワップアウト)〜
スワップアウトとは、メモリ上のデータを一時的にハードディスクへ退避させること
システム全体の処理能力が落ちる
次にデフォルト値を超える値を設定する必要がある為、デフォルト値を算出します。
--max-old-space-sizeのデフォルト値の算出方法
MacOS 64bit
メモリ 16 GB
node v18.18.0
での検証です。
node -e 'console.log(Math.floor(v8.getHeapStatistics().heap_size_limit/1024/1024))'
4144
デフォルト値は4144MiBでした。
こちらの記事で1400MBと書かれていましたが、今回は異なっていました。
こちらの記事でも触れられています。