无码国模产在线观看免费-无码国内精品久久人妻-无码国内精品久久综合88-无码国内精品人妻少妇-无码国内精品人妻少妇蜜桃视频-无码国语中文在线播放

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

前端內(nèi)存泄漏:你的JS代碼在偷偷“吃”內(nèi)存!

admin
2025年4月10日 10:40 本文熱度 198
本文轉(zhuǎn)載于稀土掘金技術(shù)社區(qū),作者:DoraBigHead

https://juejin.cn/post/7460150832681943092

「前端內(nèi)存泄漏:你的JS代碼在偷偷“吃”內(nèi)存!」

?

“內(nèi)存泄漏?我的瀏覽器那么多內(nèi)存,管他呢!”
“哥,等你頁(yè)面打開(kāi)半小時(shí),Chrome開(kāi)始吃掉你所有的RAM,你就知道怕了……”

?

你有沒(méi)有遇到過(guò)這樣的問(wèn)題:你的Web應(yīng)用在剛啟動(dòng)時(shí)運(yùn)行流暢,但使用一段時(shí)間后,變得越來(lái)越卡?任務(wù)管理器一打開(kāi),瀏覽器占用的內(nèi)存高得離譜,就像一頭無(wú)底洞的野獸,吞噬著你的RAM,直到你的電腦風(fēng)扇狂吼,最后頁(yè)面直接崩潰。

恭喜,你遇上了前端開(kāi)發(fā)者的夢(mèng)魘——「內(nèi)存泄漏」

今天,我們不講廢話,直奔主題,帶你徹底搞懂前端內(nèi)存泄漏的成因、定位、解決方案,讓你的代碼更優(yōu)雅,不再成為用戶電腦的“內(nèi)存殺手”!


「啥是前端內(nèi)存泄漏?」

我們先來(lái)復(fù)習(xí)下,「內(nèi)存管理的基本原理」

  1. 「分配內(nèi)存」:JavaScript在執(zhí)行時(shí),需要分配內(nèi)存來(lái)存儲(chǔ)變量、對(duì)象、DOM元素等。
  2. 「使用內(nèi)存」:代碼運(yùn)行過(guò)程中,會(huì)不斷創(chuàng)建和操作這些變量。
  3. 「釋放內(nèi)存」:當(dāng)變量不再被引用時(shí),JS引擎的垃圾回收機(jī)制(GC,Garbage Collector)會(huì)回收這些不再使用的對(duì)象。

「問(wèn)題就出在這里!」 如果某些變量或?qū)ο笕匀槐粺o(wú)意間引用,即使它們已經(jīng)“沒(méi)用了”,GC也無(wú)法回收它們,導(dǎo)致內(nèi)存使用量不斷增加——這就是「內(nèi)存泄漏」

「GC不是萬(wàn)能的,JS的記憶力很差」

很多人以為JS的垃圾回收機(jī)制會(huì)自動(dòng)幫你清理所有無(wú)用的內(nèi)存。「大錯(cuò)特錯(cuò)!」 JS的垃圾回收是基于「引用計(jì)數(shù)」「可達(dá)性分析」來(lái)決定對(duì)象是否應(yīng)該被回收的。

  • 「引用計(jì)數(shù)(Reference Counting)」 :如果一個(gè)對(duì)象仍然被其他對(duì)象引用,就不會(huì)被回收。
  • 「可達(dá)性分析(Reachability Analysis)」 :如果一個(gè)對(duì)象從全局作用域或當(dāng)前執(zhí)行的代碼路徑上無(wú)法訪問(wèn),它才會(huì)被回收。

所以,只要你的代碼里「無(wú)意間」殘留了一些對(duì)無(wú)用對(duì)象的引用,GC就無(wú)能為力了。


「常見(jiàn)的前端內(nèi)存泄漏場(chǎng)景(附真實(shí)案例)」

「1. 忘記清理定時(shí)器(setInterval / setTimeout)」

「殺傷力指數(shù):??????????」

「案例」

functionstartTimer({
  setInterval(() => {
    console.log("Hello, 內(nèi)存泄漏!");
  }, 1000);
}

這個(gè)setInterval會(huì)一直執(zhí)行,哪怕你離開(kāi)這個(gè)頁(yè)面,它也不會(huì)停止,導(dǎo)致整個(gè)應(yīng)用的內(nèi)存占用越來(lái)越高!

「解決方案」

functionstartTimer({
  const timerId = setInterval(() => {
    console.log("Hello, 內(nèi)存泄漏!");
  }, 1000);

  return() => clearInterval(timerId); // 提供一個(gè)清理函數(shù)
}

在組件銷(xiāo)毀時(shí)(如useEffectcleanup或Vue的beforeDestroy鉤子),手動(dòng)清理定時(shí)器。


「2. 事件監(jiān)聽(tīng)器沒(méi)有被移除」

「殺傷力指數(shù):????????」

「案例」

document.getElementById("btn").addEventListener("click"function ({
  console.log("按鈕被點(diǎn)擊了!");
});

如果這個(gè)按鈕被動(dòng)態(tài)刪除,事件監(jiān)聽(tīng)器仍然存在,并引用了內(nèi)存中的對(duì)象,導(dǎo)致內(nèi)存泄漏。

「解決方案」

const btn = document.getElementById("btn");

functionhandleClick({
  console.log("按鈕被點(diǎn)擊了!");
}

btn.addEventListener("click", handleClick);

// 記得在不需要時(shí)移除監(jiān)聽(tīng)器
btn.removeEventListener("click", handleClick);

在Vue或React中,應(yīng)該在組件卸載時(shí)清理事件監(jiān)聽(tīng)器,比如useEffectreturn,或者Vue的beforeUnmount鉤子。


「3. 綁定在全局對(duì)象(window, document)的變量」

「殺傷力指數(shù):????????」

「案例」

window.myData = newArray(1000000).fill("占內(nèi)存啦!");

只要window.myData存在,這塊巨大的數(shù)組永遠(yuǎn)不會(huì)被GC回收!

「解決方案」

window.myData = null// 手動(dòng)釋放引用

或者使用WeakMap存儲(chǔ)不需要長(zhǎng)時(shí)間保留的數(shù)據(jù):

const cache = newWeakMap();
const key = {};
cache.set(key, newArray(1000000).fill("不會(huì)導(dǎo)致泄漏"));

WeakMap會(huì)自動(dòng)釋放沒(méi)有強(qiáng)引用的對(duì)象。


「4. 組件未正確銷(xiāo)毀(React/Vue)」

「殺傷力指數(shù):??????????」

在單頁(yè)應(yīng)用(SPA)中,如果組件卸載后仍然持有狀態(tài),就會(huì)導(dǎo)致內(nèi)存泄漏。

「React案例」

useEffect(() => {
  const intervalId = setInterval(() => {
    console.log("還活著!");
  }, 1000);

  return() => clearInterval(intervalId); // 記得清理
}, []);

「Vue案例」

<script>
exportdefault {
  mounted() {
    this.intervalId = setInterval(() => {
      console.log("還活著!");
    }, 1000);
  },
  beforeDestroy() {
    clearInterval(this.intervalId); // 記得清理
  }
};
</script>

使用Vue3 Composition API:

import { onMounted, onUnmounted } from"vue";

onMounted(() => {
  const timer = setInterval(() => {
    console.log("Hello Vue3!");
  }, 1000);

  onUnmounted(() => clearInterval(timer));
});

「如何檢測(cè)和修復(fù)前端內(nèi)存泄漏?」

「1. 使用 Chrome DevTools 的 Performance 分析」

  • 「打開(kāi) DevTools(F12)」
  • 「Memory 面板」
  • 「使用 Heap Snapshot 找出無(wú)法回收的對(duì)象」
  • 「Timeline 觀察內(nèi)存占用是否持續(xù)增長(zhǎng)」

「2. 避免不必要的全局變量」

  • 「使用 let 和 const 而不是 var
  • 「減少對(duì) window 的直接引用」

「3. 組件生命周期管理」

  • 「React/Vue 組件銷(xiāo)毀時(shí),清理所有定時(shí)器、事件監(jiān)聽(tīng)器」
  • 「使用 WeakMap 避免不必要的強(qiáng)引用」

「結(jié)語(yǔ):內(nèi)存泄漏不可怕,可怕的是你不重視!」

?

「前端工程師的內(nèi)存泄漏修復(fù)史,往往是一部血淚史。」

?

當(dāng)你的頁(yè)面越來(lái)越卡,用戶體驗(yàn)崩潰,你才發(fā)現(xiàn)是“隱藏的內(nèi)存炸彈”在作祟。因此,養(yǎng)成良好的代碼習(xí)慣,定期檢查內(nèi)存占用,才能讓你的應(yīng)用流暢運(yùn)行,告別“卡成PPT”的尷尬局面!??


該文章在 2025/4/11 10:14:51 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 99久久综合精品五月天 | 国产熟妇久久精品亚洲熟女图片 | 91国在线国内在线播放 | 激情久久av免费一区二区 | 国产日韩av免费无码一区二区三区 | 国产成人大尺度深夜视频 | 国产91精品一区二区三区四区高清在线观看 | 精品人妻无码一区二区三区GIF | 无码任你躁久久久久久老妇双 | 久久久不卡 | 顶级欧美熟妇高潮xxxx | 国产精品欧美一区二区三区 | 久久久久久免费国产欧美另类精品久久久综合体桃花网 | 亚洲国产成人久久一区二区三区 | 波多野结衣av一区二区全免费观看 | 国产精品av毛片免费观看网站 | 日本一二三区免费高清视频 | 国产色欲av一区二区三区麻豆 | 日韩AV爽爽爽久久久久久 | 婷婷开心激情综合五月天 | 波多野结衣乳喷高潮视频 | 国产福利一区二区三区在线播放 | 日本大片凶猛办公室 | 爱爱帝国亚洲一区二区三区 | 精品一区二区三区四区在线播放 | 日韩一区二区综合精品 | 亚洲久久无码在线视频 | 国产伦精品一区二区三区妓 | 三级高清免费 | 欧美日韩人妻自慰喷水一级综合 | 国产色情A久久无码影 | 2024久久国产精品免费热麻豆 | 精品久久国产字幕高潮69久久夜色精品国产69乱 | 国产精品亚洲片在线花蝴蝶 | 国产成人av无码专区亚洲 | 亚洲风情无码免费视频 | 亚洲午夜无码毛片AV久久 | 日本人妻丰满熟妇久久久久久 | 久久国产精品只做精品 | 无码aⅴ精品一区 | 麻豆精品国产片在线观看 |