公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

前端內存泄漏:你的JS代碼在偷偷“吃”內存!

admin
2025年4月10日 10:40 本文熱度 205
本文轉載于稀土掘金技術社區,作者:DoraBigHead

https://juejin.cn/post/7460150832681943092

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

?

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

?

你有沒有遇到過這樣的問題:你的Web應用在剛啟動時運行流暢,但使用一段時間后,變得越來越卡?任務管理器一打開,瀏覽器占用的內存高得離譜,就像一頭無底洞的野獸,吞噬著你的RAM,直到你的電腦風扇狂吼,最后頁面直接崩潰。

恭喜,你遇上了前端開發者的夢魘——「內存泄漏」。

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


「啥是前端內存泄漏?」

我們先來復習下,「內存管理的基本原理」

  1. 「分配內存」:JavaScript在執行時,需要分配內存來存儲變量、對象、DOM元素等。
  2. 「使用內存」:代碼運行過程中,會不斷創建和操作這些變量。
  3. 「釋放內存」:當變量不再被引用時,JS引擎的垃圾回收機制(GC,Garbage Collector)會回收這些不再使用的對象。

「問題就出在這里!」 如果某些變量或對象仍然被無意間引用,即使它們已經“沒用了”,GC也無法回收它們,導致內存使用量不斷增加——這就是「內存泄漏」

「GC不是萬能的,JS的記憶力很差」

很多人以為JS的垃圾回收機制會自動幫你清理所有無用的內存。「大錯特錯!」 JS的垃圾回收是基于「引用計數」「可達性分析」來決定對象是否應該被回收的。

  • 「引用計數(Reference Counting)」 :如果一個對象仍然被其他對象引用,就不會被回收。
  • 「可達性分析(Reachability Analysis)」 :如果一個對象從全局作用域或當前執行的代碼路徑上無法訪問,它才會被回收。

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


「常見的前端內存泄漏場景(附真實案例)」

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

「殺傷力指數:??????????」

「案例」

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

這個setInterval會一直執行,哪怕你離開這個頁面,它也不會停止,導致整個應用的內存占用越來越高!

「解決方案」

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

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

在組件銷毀時(如useEffectcleanup或Vue的beforeDestroy鉤子),手動清理定時器。


「2. 事件監聽器沒有被移除」

「殺傷力指數:????????」

「案例」

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

如果這個按鈕被動態刪除,事件監聽器仍然存在,并引用了內存中的對象,導致內存泄漏。

「解決方案」

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

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

btn.addEventListener("click", handleClick);

// 記得在不需要時移除監聽器
btn.removeEventListener("click", handleClick);

在Vue或React中,應該在組件卸載時清理事件監聽器,比如useEffectreturn,或者Vue的beforeUnmount鉤子。


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

「殺傷力指數:????????」

「案例」

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

只要window.myData存在,這塊巨大的數組永遠不會被GC回收!

「解決方案」

window.myData = null// 手動釋放引用

或者使用WeakMap存儲不需要長時間保留的數據:

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

WeakMap會自動釋放沒有強引用的對象。


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

「殺傷力指數:??????????」

在單頁應用(SPA)中,如果組件卸載后仍然持有狀態,就會導致內存泄漏。

「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));
});

「如何檢測和修復前端內存泄漏?」

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

  • 「打開 DevTools(F12)」
  • 「Memory 面板」
  • 「使用 Heap Snapshot 找出無法回收的對象」
  • 「Timeline 觀察內存占用是否持續增長」

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

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

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

  • 「React/Vue 組件銷毀時,清理所有定時器、事件監聽器」
  • 「使用 WeakMap 避免不必要的強引用」

「結語:內存泄漏不可怕,可怕的是你不重視!」

?

「前端工程師的內存泄漏修復史,往往是一部血淚史?!?/strong>

?

當你的頁面越來越卡,用戶體驗崩潰,你才發現是“隱藏的內存炸彈”在作祟。因此,養成良好的代碼習慣,定期檢查內存占用,才能讓你的應用流暢運行,告別“卡成PPT”的尷尬局面!??


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

主站蜘蛛池模板: 国产精品啪啪视频一区二区 | 99精品全国免费观看视频 | 国产在线精品一区二区三区直 | 国产亚洲日韩激情视濒 | 二区三区中文字幕 | 国产涩色av一区二区三区 | av免费不| 囯产免费久久久 | 精品性影院一区二区三区内射 | 国产无码一区二区三 | 成人午夜国产一区 | 国产一级av片精品久久 | 99久久精品午夜 | 18禁无遮挡啪啪无码网站 | 国产精品白浆无码流出在线观看 | 动漫精品专区一区二区三区不 | 99国产精品自在自在久久 | 国产后入清纯学生妹 | 国产私伦一区二区三区 | 国内自拍真实伦在线观看视频 | 精产国品一二三产品麻豆 | 国产三级高清视频在线观看 | 国产精品熟女一区二区 | 国产三级不卡在线播放 | 国产成在线观看免费视 | 国产成人无码āā精品一区 | 国产精品亚洲欧美日韩在线播放 | 国产麻豆剧果冻传媒视频免费 | 国产aⅴ一区二区三区精品 国产aⅴ一区二区三区片 | 18禁裸乳无遮挡自慰免费动漫 | 国产欧美日韩中文久久 | 91精品午夜福利在线观看 | 变态拳头交视 | 韩国三级大胸女高清视频 | 国产一级性爱视频 | 91无码人妻精品一区二区 | 国产一级无码av | 国产一区二区三区精品网站 | 2025国产麻豆剧果冻传媒免费 | 国产麻豆剧果冻传媒星空视频 | 国产精品狼人 |