How to Fix "FATAL ERROR: JavaScript heap out of memory" in Next.js


I continued running into these OOM (out of memory) errors when using Next.js.

I would encounter an error that looks something like this:

wait - compiling...

<--- Last few GCs --->

[82128:0x102a81000]  5231616 ms: Mark-sweep 2091.9 (2100.2) -> 2091.6 (2100.2) MB, 260.0 / 0.1 ms  (average mu = 0.584, current mu = 0.000) last resort GC in old space requested
[82128:0x102a81000]  5231884 ms: Mark-sweep 2091.6 (2100.2) -> 2090.3 (2100.2) MB, 267.7 / 0.0 ms  (average mu = 0.393, current mu = 0.000) last resort GC in old space requested

<--- JS stacktrace --->

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1: 0x100080a4c node::Abort() [/usr/local/Cellar/node/13.13.0_2/bin/node]
2: 0x100080bc2 node::OnFatalError(char const*, char const*) [/usr/local/Cellar/node/13.13.0_2/bin/node]
3: 0x100180be5 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/Cellar/node/13.13.0_2/bin/node]
...

And it would continue to display the entire stacktrace.

There seems to be a strict ceiling for memory usage in node (around 1-2 GB on most 64-bit systems).

We can bump that up using the max_old_space_size flag.

--max-old-space-size=<amount of memory in MB>

We would have to run something along the lines of node --max-old-space-size=4096 index.js.

The issue is that Next.js doesn’t allow us to set node properties directly as a flag.

Fortunately, we can just set NODE_OPTIONS before running our next command. Here’s an example with next dev.

// package.json
"scripts": {
    ...
    "dev": "NODE_OPTIONS=--max_old_space_size=4096 next dev",
    ...
},