🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

Node.js में मेमोरी लीक को कैसे डीबग करें: संपूर्ण चरण-दर-चरण मार्गदर्शिका 2026

⏱️3 min read  ·  622 words

{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “Node.js में मेमोरी लीक को कैसे डीबग करें: संपूर्ण चरण-दर-चरण मार्गदर्शिका 2026”,
“description”: “Chrome DevTools, क्लिनिक.js और –inspect फ़्लैग का उपयोग करके Node.js मेमोरी लीक का निदान करें और उसे ठीक करें। वास्तविक कोड उदाहरणों के साथ सामान्य रिसाव पैटर्न को कवर करता है।”,
“url”: “https://techpulsesite.com/how-to-debug-memory-leaks-in-node-js-com-hi/”,
“datePublished”: “2026-06-28T17:05:00+00:00”,
“dateModified”: “2026-06-29T04:14:13+00:00”,
“author”: {
“@type”: “Organization”,
“name”: “TechPulse Editorial Team”,
“url”: “https://techpulsesite.com”
},
“publisher”: {
“@type”: “Organization”,
“name”: “TechPulse”,
“url”: “https://techpulsesite.com”
},
“inLanguage”: “hi”
}

{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “Node.js में मेमोरी लीक को कैसे डीबग करें: संपूर्ण चरण-दर-चरण मार्गदर्शिका 2026”,
“description”: “Chrome DevTools, क्लिनिक.js और –inspect फ़्लैग का उपयोग करके Node.js मेमोरी लीक का निदान करें और उसे ठीक करें। वास्तविक कोड उदाहरणों के साथ सामान्य रिसाव पैटर्न को कवर करता है।”,
“url”: “https://techpulsesite.com/how-to-debug-memory-leaks-in-node-js-com-hi/”,
“datePublished”: “2026-06-28T17:05:00+00:00”,
“dateModified”: “2026-06-28T18:23:40+00:00”,
“author”: {
“@type”: “Organization”,
“name”: “TechPulse Editorial Team”,
“url”: “https://techpulsesite.com”
},
“publisher”: {
“@type”: “Organization”,
“name”: “TechPulse”,
“url”: “https://techpulsesite.com”
},
“inLanguage”: “hi”
}

एक Node.jsस्मृति रिसाव आपकी प्रक्रिया धीरे-धीरे अधिक रैम की खपत करती है जब तक कि यहFATAL ERROR: Reached heap limitके साथ क्रैश न हो जाए या अनुरोधों को पूरा करने में बहुत धीमा हो जाता है। उत्पादन में, यह अक्सर साप्ताहिक सर्वर पुनरारंभ या प्रतिक्रिया समय में गिरावट के रूप में प्रकट होता है। यहां बताया गया है कि उन्हें कैसे ढूंढें और ठीक करें।

Node.js में मेमोरी लीक क्या है?

मेमोरी लीक तब होता है जब ऑब्जेक्ट को मेमोरी में आवंटित किया जाता है लेकिन कभी जारी नहीं किया जाता है – क्योंकि कुछ अभी भी उनके लिए एक संदर्भ रखता है, जिससे कचरा संग्रहण को रोका जा सकता है। सामान्य कारण: डेटा जमा करने वाले वैश्विक चर, ईवेंट श्रोताओं को कभी नहीं हटाया गया, बड़ी वस्तुओं को कैप्चर करना बंद करना, कैश जो असीमित रूप से बढ़ते हैं, और ऑब्जेक्ट के संदर्भ रखने वाले टाइमर कॉलबैक।

चरण 1: पुष्टि करें कि आपके पास मेमोरी लीक है

// Monitor memory usage in your application
function logMemory() {
  const used = process.memoryUsage();
  console.log({
    heapUsed:   `${Math.round(used.heapUsed / 1024 / 1024)}MB`,
    heapTotal:  `${Math.round(used.heapTotal / 1024 / 1024)}MB`,
    rss:        `${Math.round(used.rss / 1024 / 1024)}MB`,
    external:   `${Math.round(used.external / 1024 / 1024)}MB`,
  });
}

setInterval(logMemory, 5000);  // log every 5 seconds under load

लोड परीक्षण चलाएँ और संख्याएँ देखें। यदिheapUsed लगातार बढ़ता है और जीसी चक्र के बाद कभी नहीं गिरता, आपके पास रिसाव है।

चरण 2: –निरीक्षण + Chrome DevTools

# Start Node with inspector
node --inspect app.js
# or for existing process
kill -USR1 <PID>

का उपयोग करें Chrome खोलें औरchrome://inspectपर नेविगेट करें . “नोड के लिए समर्पित DevTools खोलें” पर क्लिक करें। मेमोरी टैब में, एक ढेर स्नैपशॉट लें, लोड उत्पन्न करें, 60 सेकंड प्रतीक्षा करें, दूसरा स्नैपशॉट लें। उनकी तुलना करें:

दूसरे स्नैपशॉट में, ड्रॉपडाउन से “तुलना” चुनें। “आकार डेल्टा” के आधार पर क्रमबद्ध करें – सबसे तेजी से बढ़ने वाली वस्तुएं आपके लीक उम्मीदवार हैं।

चरण 3: स्वचालित निदान के लिए क्लिनिक.जेएस का उपयोग करें

npm install -g clinic

# Run your app under clinic
clinic doctor -- node app.js

# More detailed heap analysis
clinic heapprofiler -- node app.js

# Flame graph for CPU + memory
clinic flame -- node app.js

क्लिनिक समय के साथ स्मृति वृद्धि को दर्शाने वाली एक HTML रिपोर्ट तैयार करता है, समस्याग्रस्त अंतरालों की पहचान करता है, और अक्सर लीक हुए कोड पैटर्न को सीधे इंगित करता है।

सामान्य लीक पैटर्न 1: इवेंट श्रोता नहीं हटाए गए

// 🐛 Bug: listener added but never removed
class DataProcessor {
  constructor(emitter) {
    emitter.on('data', this.processData.bind(this));
    // When DataProcessor is destroyed, emitter still holds reference
    // → DataProcessor and its data are never GC'd
  }
}

// ✅ Fix: remove listener when done
class DataProcessor {
  constructor(emitter) {
    this.emitter = emitter;
    this.handler = this.processData.bind(this);
    emitter.on('data', this.handler);
  }

  destroy() {
    this.emitter.off('data', this.handler);  // cleanup
  }
}

// Check for listener leaks (Node warns at 11+ listeners)
emitter.setMaxListeners(20);  // raise limit if legitimately needed
console.log(emitter.listenerCount('data'));  // monitor count

सामान्य लीक पैटर्न 2: अनबाउंडेड कैश या मैप

// 🐛 Bug: cache grows forever
const cache = new Map();
function getCachedData(key) {
  if (!cache.has(key)) {
    cache.set(key, fetchFromDB(key));  // never evicted
  }
  return cache.get(key);
}

// ✅ Fix: bounded LRU cache
const LRU = require('lru-cache');
const cache = new LRU({ max: 1000, ttl: 1000 * 60 * 5 });  // 5-min TTL, max 1000 entries

// Or simple manual TTL approach
const cache = new Map();
function getCachedData(key) {
  const entry = cache.get(key);
  if (entry && Date.now() - entry.time < 300000) {
    return entry.data;
  }
  const data = fetchFromDB(key);
  cache.set(key, { data, time: Date.now() });
  // Evict old entries periodically
  if (cache.size > 1000) cache.delete(cache.keys().next().value);
  return data;
}

सामान्य रिसाव पैटर्न 3: बड़ी वस्तुओं को कैप्चर करना

// 🐛 Bug: closure keeps large data alive
function processLargeFile(data) {
  const hugeBuffer = Buffer.alloc(100 * 1024 * 1024); // 100MB
  hugeBuffer.copy(data);

  return function processChunk(chunk) {
    // This closure captures hugeBuffer — stays in memory as long as
    // processChunk function exists, even if we only need one small field
    return hugeBuffer.slice(0, 10);
  };
}

// ✅ Fix: extract only what you need before creating closure
function processLargeFile(data) {
  const hugeBuffer = Buffer.alloc(100 * 1024 * 1024);
  hugeBuffer.copy(data);
  const needed = hugeBuffer.slice(0, 10);  // extract needed data
  // hugeBuffer can now be GC'd — closure only captures 'needed'
  return function processChunk(chunk) {
    return needed;
  };
}

सामान्य लीक पैटर्न 4: सेटइंटरवल विदाउट क्लियरइंटरवल

// 🐛 Bug: interval keeps closure alive forever
function startWorker(data) {
  const interval = setInterval(() => {
    process(data);  // data never released because interval holds it
  }, 1000);
  // interval never cleared when worker is "stopped"
}

// ✅ Fix: always clear intervals
function startWorker(data) {
  const interval = setInterval(() => {
    process(data);
  }, 1000);

  return function stop() {
    clearInterval(interval);  // release the closure reference
  };
}

चरण 4: हीपडंप के साथ हीप डंप विश्लेषण

npm install heapdump

// In your app — trigger a dump on SIGUSR2
const heapdump = require('heapdump');
process.on('SIGUSR2', () => {
  heapdump.writeSnapshot((err, filename) => {
    console.log('Heap snapshot written to', filename);
  });
});

// Trigger from terminal
kill -USR2 <PID>

Chrome DevTools में .heapsnapshot फ़ाइल खोलें (मेमोरी टैब → लोड → फ़ाइल चुनें)। उन वस्तुओं के लिए फ़िल्टर करें जिन पर आपको संदेह है। उच्च “बरकरार आकार” वाली वस्तुओं की तलाश करें – यही वह स्मृति है जो उस वस्तु द्वारा जीवित रखी जाती है।

अक्सर पूछे जाने वाले प्रश्न

प्रश्न: हीपयूज्ड और आरएसएस के बीच क्या अंतर है?
A: heapUsed V8 जावास्क्रिप्ट हीप मेमोरी है। RSS (निवासी सेट आकार) देशी बफ़र्स, कोड और हीप सहित कुल प्रक्रिया मेमोरी है। बिना heapUsed के बढ़ता हुआ RSS एक देशी मॉड्यूल लीक का सुझाव देता है।

प्रश्न: क्या मैं कचरा संग्रहण को परीक्षण के लिए बाध्य कर सकता हूँ?
उत्तर: हाँ:node --expose-gc app.js फिर कॉल करेंglobal.gc(). यदि मैन्युअल जीसी के बाद मेमोरी काफी कम हो जाती है लेकिन फिर से बढ़ जाती है, तो आपने उत्पादन रिसाव की पुष्टि की है।

प्रश्न: मैं उत्पादन में लीक का पता कैसे लगा सकता हूँ?
ए: एपीएम टूल का उपयोग करें: डेटाडॉग, न्यू रेलिक, या इलास्टिक एपीएम सभी समय के साथ ढेर वृद्धि की निगरानी करते हैं। 80% ढेर उपयोग पर अलर्ट सेट करें।--max-old-space-size=512पर भी विचार करें ढेर को सीमित करना और धीमी गिरावट के बजाय तेजी से विफल होना।

प्रश्न: क्या लीक को रोकने के लिए WeakMap/WeakRef उपयोगी है?
उत्तर: हाँ. WeakMap औरWeakSet कमज़ोर संदर्भ रखें – यदि मुख्य ऑब्जेक्ट में कोई अन्य संदर्भ नहीं है, तो यह GC के लिए योग्य है, भले ही यह WeakMap में एक कुंजी हो। वस्तुओं के संग्रह को रोके बिना उनके बारे में मेटाडेटा को कैशिंग करने के लिए उपयोगी।

प्रश्न: Node.js के लिए एक अच्छा अधिकतम ढेर आकार क्या है?
उत्तर: डिफ़ॉल्ट ~1.5GB (64-बिट) है।--max-old-space-size=2048के साथ स्पष्ट रूप से सेट करें (2जीबी). उपलब्ध रैम का आकार 70-80%, ओएस और अन्य प्रक्रियाओं के लिए जगह छोड़कर।

निष्कर्ष

Node.js मेमोरी लीक का निदान किया जा सकता है और सही टूल से इसे ठीक किया जा सकता है। वर्कफ़्लो:मेमोरी लॉगिंग के साथ रिसाव की पुष्टि करें → Chrome DevTools हीप स्नैपशॉट के साथ अलग करें → पैटर्न (श्रोता, कैश, क्लोजर, टाइमर) की पहचान करें → ठीक करें और सत्यापित करें. इस गाइड के चार पैटर्न 90% उत्पादन मेमोरी लीक के लिए जिम्मेदार हैं। संदेह होने पर, क्लिनिक.जेएस आपको मिनटों के भीतर सही दिशा बताएगा।

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা