If you've encountered the dreaded "FATAL ERROR: Reached heap limit Allocation failed – JavaScript heap out of memory", you're not alone.
This error usually happens in Node.js when your application exceeds the default memory allocation. Large applications, heavy data processing, and memory leaks can cause this issue.
But don’t worry! In this guide, we’ll cover why this happens and multiple ways to fix it effectively.
The JavaScript heap is the memory space allocated for storing objects, arrays, and functions.
By default, Node.js has a memory limit of:
1.5 GB on 32-bit systems
4 GB on 64-bit systems
When a process exceeds this heap limit, Node.js throws the "heap out of memory" error, and your application crashes.
💡 Common causes of the error:
✅ Large datasets loaded into memory at once
✅ Memory leaks (unreleased memory after execution)
✅ Inefficient loops or recursive function calls
✅ Lack of garbage collection optimization
Here are multiple methods to fix this error:
The easiest fix is to increase the heap memory allocation for Node.js.
✅ Run your script with --max-old-space-size
flag:
node --max-old-space-size=8192 your-script.js
This sets the memory limit to 8GB (8192 MB) instead of the default. You can adjust the value based on your system’s available memory.
🛠 For npm scripts, update your package.json
:
"scripts": {
"start": "node --max-old-space-size=8192 server.js"
}
💡 Tip: If you’re using a build tool like Webpack, run:
NODE_OPTIONS="--max-old-space-size=8192" webpack
A memory leak occurs when objects are not released from memory after execution.
✅ Use Chrome DevTools to detect memory leaks:
1️⃣ Run your Node.js app with:
node --inspect server.js
2️⃣ Open Chrome and go to chrome://inspect
.
3️⃣ Click on Memory → Take a heap snapshot.
4️⃣ Look for growing memory usage in the snapshot.
💡 Common memory leak scenarios:
❌ Unused variables persisting in global scope
❌ Storing large arrays or objects in memory unnecessarily
❌ Using setInterval
without clearInterval
✔ Fix memory leaks by explicitly removing references:
let bigArray = new Array(1000000).fill("data");
// Free memory after use
bigArray = null;
global.gc(); // Manually trigger garbage collection
Loading large files into memory at once can crash Node.js.
❌ Bad Example (Memory-Intensive File Read):
const fs = require('fs');
const data = fs.readFileSync('large-file.json'); // Loads entire file into memory
console.log(JSON.parse(data));
✔ Better Approach (Using Streams to Process Data in Chunks):
const fs = require('fs');
const readStream = fs.createReadStream('large-file.json');
readStream.on('data', (chunk) => {
console.log(chunk.toString());
});
JavaScript relies on automatic garbage collection. However, you can force garbage collection manually if needed.
✅ Enable garbage collection debugging in Node.js:
node --expose-gc my-script.js
✅ Trigger manual garbage collection in your code:
if (global.gc) {
global.gc();
} else {
console.warn('Garbage collection is not enabled.');
}
⚠️ Warning: Avoid excessive manual garbage collection—it should only be used for debugging.
If your loop stores too much data in memory, it can trigger the error.
❌ Bad Example (Storing Unnecessary Data in Loop):
let data = [];
for (let i = 0; i < 1000000; i++) {
data.push({ index: i, value: Math.random() });
}
✔ Better Approach (Process Data Efficiently Without Holding Everything in Memory):
If you’re facing the "JavaScript heap out of memory" error, try these fixes:
✅ Increase heap memory using --max-old-space-size
✅ Detect memory leaks using Chrome DevTools
✅ Use streams instead of loading large data in memory
✅ Manually trigger garbage collection (only for debugging)
✅ Optimize loops to avoid storing unnecessary data
By implementing these strategies, you can prevent memory-related crashes and improve Node.js application performance.
💡 Have you encountered this error? What fix worked for you? Let us know in the comments! 🚀