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:
<code class="language-javascript">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);</code>
<code class="language-javascript">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);</code>
2. React's perangkap: useEffect
boleh menyebabkan kebocoran: useEffect
<code class="language-javascript">function DataFetcher() { const [data, setData] = useState(null); useEffect(() => { const fetchData = async () => { const response = await api.getData(); setData(response); // Leak: updates state after unmount }; fetchData(); }, []); }</code>
<code class="language-javascript">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; }; }, []); }</code>
3. Penutupan yang memegang objek besar:
Penutupan secara tidak sengaja dapat mengekalkan objek besar:
<code class="language-javascript">function createLargeObject() { return new Array(1000000).fill('?'); } function setupHandler() { const largeObject = createLargeObject(); return () => { console.log(largeObject.length); }; } const handler = setupHandler(); // largeObject persists</code>
Mengesan kebocoran memori
Chrome Devtools:
<code class="language-javascript">// Memory usage helper function debugMemory() { console.log('Memory:', performance.memory.usedJSHeapSize / 1024 / 1024, 'MB'); }</code>
Amalan terbaik pencegahan
WeakMap
: WeakSet
Gunakan ini untuk melampirkan metadata tanpa menghalang pengumpulan sampah.
useEffect
alat untuk pengesanan kebocoran memori
<code class="language-javascript">// 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'); }</code>
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!