Apakah kebocoran memori?
Dalam aplikasi web, kebocoran memori berlaku apabila aplikasi anda menyimpan rujukan kepada objek yang tidak lagi diperlukan. Ini menghalang pemungut sampah JavaScript daripada menuntut semula memori, yang membawa kepada kemerosotan prestasi.
Penyebab kebocoran memori biasa
1. Pendengar Acara yang berterusan:
Lupa untuk menghapuskan pendengar acara adalah pelakunya yang kerap. Contoh berikut menunjukkan ini:
function setupHandler() { const button = document.getElementById('myButton'); const heavyObject = { data: new Array(10000).fill('?') }; button.addEventListener('click', () => { console.log(heavyObject.data); }); } // Adds a new listener every 2 seconds – a leak! setInterval(setupHandler, 2000);
function setupHandler() { const button = document.getElementById('myButton'); const heavyObject = { data: new Array(10000).fill('?') }; const handler = () => { console.log(heavyObject.data); }; button.addEventListener('click', handler); return () => button.removeEventListener('click', handler); } let cleanup = setupHandler(); setInterval(() => { cleanup(); cleanup = setupHandler(); }, 2000);
2. React's perangkap: useEffect
boleh menyebabkan kebocoran: useEffect
function DataFetcher() { const [data, setData] = useState(null); useEffect(() => { const fetchData = async () => { const response = await api.getData(); setData(response); // Leak: updates state after unmount }; fetchData(); }, []); }
function DataFetcher() { const [data, setData] = useState(null); useEffect(() => { let isSubscribed = true; const fetchData = async () => { const response = await api.getData(); if (isSubscribed) setData(response); }; fetchData(); return () => { isSubscribed = false; }; }, []); }
3. Penutupan yang memegang objek besar:
Penutupan secara tidak sengaja dapat mengekalkan objek besar:
function createLargeObject() { return new Array(1000000).fill('?'); } function setupHandler() { const largeObject = createLargeObject(); return () => { console.log(largeObject.length); }; } const handler = setupHandler(); // largeObject persists
Mengesan kebocoran memori
Chrome Devtools:
// Memory usage helper function debugMemory() { console.log('Memory:', performance.memory.usedJSHeapSize / 1024 / 1024, 'MB'); }
Amalan terbaik pencegahan
WeakMap
: WeakSet
Gunakan ini untuk melampirkan metadata tanpa menghalang pengumpulan sampah.
useEffect
alat untuk pengesanan kebocoran memori
// Simple memory monitoring function monitorMemory(fn) { const start = performance.memory.usedJSHeapSize; fn(); const end = performance.memory.usedJSHeapSize; console.log('Memory diff:', (end - start) / 1024 / 1024, 'MB'); }
Kesimpulan
Kebocoran memori berbahaya tetapi boleh dicegah. Pengekodan proaktif dan pemantauan tetap adalah kunci untuk mengekalkan aplikasi web berprestasi tinggi. Pencegahan selalu lebih baik daripada menyembuhkan.
Bacaan Lanjut:
Atas ialah kandungan terperinci Memahami kebocoran ingatan dalam aplikasi web moden: Pembunuh Prestasi Silent. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!