Introduction
Memory leaks make your Node.js app slow or crash by using too much memory over time.
Jump into concepts and practice - no test required
No specific syntax, but common patterns include: 1. Global variables holding large data. 2. Closures capturing large objects. 3. Event listeners not removed. 4. Caches growing without limits. 5. Timers or intervals not cleared.
// 1. Global variable holding data
const bigData = [];
function addData(item) {
bigData.push(item); // keeps growing forever
}// 2. Closure capturing large object function createHandler() { const largeObject = { data: new Array(1000000).fill('x') }; return function() { console.log(largeObject.data.length); }; } const handler = createHandler();
// 3. Event listener not removed const EventEmitter = require('events'); const emitter = new EventEmitter(); function onData() { // do something } emitter.on('data', onData); // never call emitter.removeListener('data', onData);
// 4. Cache growing without limit const cache = new Map(); function cacheData(key, value) { cache.set(key, value); // no limit or cleanup }
const EventEmitter = require('events'); // Memory leak example: event listeners not removed const emitter = new EventEmitter(); function leakListener() { console.log('Event received'); } // Add listener every second without removing setInterval(() => { emitter.on('data', leakListener); emitter.emit('data'); console.log('Listener count:', emitter.listenerCount('data')); }, 1000);
const cache = {};
function addToCache(key, value) {
cache[key] = value;
}
addToCache('user1', {name: 'Alice'});
addToCache('user2', {name: 'Bob'});
console.log(Object.keys(cache).length);const listeners = [];
function addListener(emitter, callback) {
emitter.on('data', callback);
listeners.push({emitter, callback});
}
// Later you forget to remove listeners