>
什么是内存泄漏? 在Web应用程序中,当您的应用程序保留不再需要的对象时,就会发生内存泄漏。这样可以防止JavaScript的垃圾收集器收回内存,从而导致性能降解。 内存泄漏的常见原因
1。 持续的事件听众:
>忘记删除事件听众是经常出现的罪魁祸首。 以下示例说明了这一点:
该解决方案涉及正确的清理:
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);
useEffect
在React中,忽略内的清理功能可能会导致泄漏:
更正的实现: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(); }, []); }
3。 关闭握在大物体上:
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; }; }, []); }
封闭可以无意间保留大物体:
function createLargeObject() { return new Array(1000000).fill('?'); } function setupHandler() { const largeObject = createLargeObject(); return () => { console.log(largeObject.length); }; } const handler = setupHandler(); // largeObject persists
> chrome devtools:
> OPEN DEVTOOLS(F12)。 >导航到“内存”选项卡。
// Memory usage helper function debugMemory() { console.log('Memory:', performance.memory.usedJSHeapSize / 1024 / 1024, 'MB'); }
资源清理:始终删除事件侦听器,清晰的间隔/超时,取消网络请求和关闭连接。
WeakMap
钩中。WeakSet
useEffect
react devtools profiler 堆快照分析仪
// 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'); }
进一步读取:
chrome devtools内存profiler文档
> React内存管理最佳实践
以上是了解现代Web应用程序中的内存泄漏:无声绩效杀手的详细内容。更多信息请关注PHP中文网其他相关文章!