Middle+
Jak zvládáte úniky paměti, když k nim dojde?
sobes.tech AI
Odpověď od AI
Pro detekci a odstranění úniků paměti používám následující metody:
- Monitorování: Pravidelně sleduji spotřebu paměti pomocí vestavěných nástrojů Node.js, jako jsou
--expose-gc,process.memoryUsage(), nebo externí nástroje jako PM2 nebo Prometheus/Grafana. - Nástroje profilování:
- Snímky haldy: Vytvářím "snímky haldy" v různých časech pomocí Chrome DevTools (nebo jiného debuggeru podporujícího protokol V8) a porovnávám je, abych identifikoval objekty, které rostou v čase a neměly by.
// Příklad použití heapdump k vytvoření snímku haldy const heapdump = require('heapdump'); // ... váš kód ... // Vytvoření snímku haldy heapdump.writeSnapshot((err, filename) => { if (err) console.error(err); else console.log('Snímek haldy uložen do:', filename); });- Profilování CPU: Někdy nejsou úniky přímo spojeny s pamětí, ale s nekonečnými smyčkami nebo nadměrným využitím CPU, což může nepřímo vést k problémům s pamětí.
- Analýza kódu: Ručně prohlížím kód, abych identifikoval běžné příčiny úniků:
- Neodstraněné obslužné rutiny událostí.
// Příklad úniku: neodstraněná obsluha událostí const EventEmitter = require('events'); const emitter = new EventEmitter(); function handler() { /* ... */ } emitter.on('myEvent', handler); // Pokud emitter stále existuje a odkaz na handler je ztracen // nebo objekt, ke kterému je připojen, má být zničen, // handler ho udrží v paměti. // Správně: // emitter.off('myEvent', handler);- Nevyčištěné časovače (
setInterval,setTimeout). - Uzávěry, které náhodou drží odkazy na velké objekty.
- Globální proměnné, které nejsou vyčištěny.
- Cache, které nekonečně rostou bez mechanismu odstraňování.
- Zapomenuté promise nebo callbacky, které udržují kontext v paměti.
- Automatizované testy: Píši testy, které simulují dlouhodobou činnost aplikace a kontrolují stabilitu spotřeby paměti.
- Revize kódu: Požádám kolegy, aby analyzovali kód na potenciální úniky.