前端開發時的內存泄漏問題

目錄

    • 🔍 什么是內存泄漏(Memory Leak)?
    • 🚨 常見的內存泄漏場景
      • 1?? 未清除的定時器(setInterval / setTimeout)
      • 2?? 全局變量(變量未正確釋放)
      • 3?? 事件監聽未清除
      • 4?? 閉包導致的內存泄漏
      • 5?? DOM 引用未釋放
    • 🛠 如何檢測和防止內存泄漏?
      • 1?? 使用 Chrome DevTools 監測內存
      • 2?? 使用 `WeakMap` 和 `WeakSet`
      • 3?? 確保在 `useEffect` 里清理副作用(React)
    • ? 總結

🔍 什么是內存泄漏(Memory Leak)?

內存泄漏 指的是 程序運行時,已經不再使用的內存無法被釋放,導致內存占用不斷增加,最終可能會導致應用性能下降甚至崩潰。

在 JavaScript 中,垃圾回收機制(GC, Garbage Collection) 會自動釋放不再使用的變量,但某些情況下,對象仍然被錯誤地引用,導致 GC 無法回收,從而造成內存泄漏。


🚨 常見的內存泄漏場景

1?? 未清除的定時器(setInterval / setTimeout)

當使用 setIntervalsetTimeout 時,如果不手動清除,函數的引用會一直保留,導致內存泄漏。

function startTimer() {setInterval(() => {console.log("Running...");}, 1000);
}
// 調用后,即使不再需要,定時器仍然占用內存
startTimer();

? 解決方法:在組件銷毀或不需要時清除定時器

const timer = setInterval(() => {console.log("Running...");
}, 1000);clearInterval(timer); // 及時清除定時器

2?? 全局變量(變量未正確釋放)

如果一個變量被賦值到 window 或全局作用域,它將一直存在,導致內存無法被回收。

window.leak = []; // 這個數組永遠不會被回收

? 解決方法:避免在 window 作用域創建變量

(function() {let tempArray = [];
})();

3?? 事件監聽未清除

當事件監聽器(如 addEventListener)綁定到 DOM 元素上,但該元素被移除時,監聽器仍然存在,導致 JavaScript 引用無法被釋放。

document.getElementById("btn").addEventListener("click", function() {console.log("Clicked!");
});

? 解決方法:組件卸載時移除監聽

const btn = document.getElementById("btn");
const handleClick = () => console.log("Clicked!");
btn.addEventListener("click", handleClick);// 在適當時機移除監聽器
btn.removeEventListener("click", handleClick);

4?? 閉包導致的內存泄漏

閉包 使得內部函數可以訪問外部函數的變量,但如果變量一直被引用,GC 無法釋放它。

function createClosure() {let data = new Array(1000000); // 大量數據return function () {console.log(data.length);};
}const closure = createClosure();
// `data` 變量不會被釋放

? 解決方法:在不需要時手動清空變量

let closure = createClosure();
closure = null; // 解除引用,讓 GC 回收

5?? DOM 引用未釋放

如果 JavaScript 變量仍然引用一個已刪除的 DOM 元素,該元素不會被回收。

let div = document.getElementById("myDiv");
document.body.removeChild(div); // 移除 DOM
// 但 div 變量仍然持有該元素的引用,導致泄漏

? 解決方法:手動釋放引用

div = null; // 解除 JavaScript 引用,讓 GC 處理

🛠 如何檢測和防止內存泄漏?

1?? 使用 Chrome DevTools 監測內存

  • 打開 Performance 面板錄制檢查內存占用
  • Memory 面板 中使用 Heap Snapshot,查看哪些對象未被釋放。

2?? 使用 WeakMapWeakSet

  • WeakMapWeakSet 不會阻止垃圾回收,適用于臨時數據存儲。
let weakMap = new WeakMap();
let obj = { key: "value" };
weakMap.set(obj, "some data");
obj = null; // `obj` 被回收,WeakMap 也自動釋放它的引用

3?? 確保在 useEffect 里清理副作用(React)

如果在 React 組件中添加 事件監聽、定時器 等,一定要在 useEffect 里清理:

useEffect(() => {const interval = setInterval(() => {console.log("Running...");}, 1000);return () => clearInterval(interval); // 組件卸載時清除定時器
}, []);

? 總結

  • 內存泄漏 = 無用的對象無法被 GC 釋放,導致內存占用持續增長
  • 常見原因:未清理 定時器、事件監聽、閉包、DOM 引用、全局變量
  • 如何避免?
    • 清除定時器和事件監聽 (clearInterval, removeEventListener)
    • 避免不必要的全局變量
    • 正確管理閉包(在不需要時清空變量)
    • 使用 Chrome DevTools 檢查內存泄漏
    • 在 React 組件中使用 useEffect 清理副作用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899941.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 基礎-30-單例設計模式:懶漢式與餓漢式

在軟件開發中,單例設計模式(Singleton Design Pattern)是一種常用的設計模式,它確保一個類只有一個實例,并提供一個全局訪問點。這種模式通常用于管理共享資源(如數據庫連接池、線程池等)或需要…

為 MinIO AIStor 引入模型上下文協議(MCP)服務器

Anthropic 最近宣布的模型上下文協議 (MCP) 將改變我們與技術交互的方式。它允許自然語言通信替換許多任務的復雜命令行語法。不僅如此,語言模型還可以總結傳統工具的豐富輸出,并以人類可讀的形式呈現關鍵信息。MinIO 是世界領先的…

2023年12月電子學會青少年軟件編程四級考級真題—新“跳7”游戲

此題可點下方去處查看,支持在線編程,獲取源碼: 新“跳7”游戲_scratch_少兒編程題庫學習中心-嗨信奧https://www.hixinao.com/tiku/scratch/show-5109.html?_shareid3 程序演示可點擊下方查看,支持源碼查看:新“跳7…

3D 地圖渲染-區域紋理圖添加

引入-初始化地圖&#xff08;關鍵代碼&#xff09; // 初始化頁面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申請的key值></script>// 添加地圖容器 <div idcontainer ></div>// 地圖初始化應該…

如何避免內存泄漏,尤其是在React中

在React中避免內存泄漏主要涉及到兩個方面&#xff1a;組件的卸載清理和異步操作的正確管理。以下是幾個關鍵的策略和最佳實踐&#xff1a; 1. 清理組件中的事件監聽器和定時器 當組件卸載時&#xff0c;確保清除所有綁定的事件監聽器和定時器&#xff0c;否則它們會持續占用內…

如何學習C++以及C++的宏觀認知

學習方法 首先可以給出一個論斷&#xff1a;C的語法和各種組件的原理及使用可以說是所有編程語言里面比較難的 那么如何掌握所有東西&#xff0c;比如網絡編程&#xff0c;文件讀寫&#xff0c;STL。 不要對語法記各種筆記&#xff0c;比如vector容器有什么什么方法什么什么…

Minimind 訓練一個自己專屬語言模型

發現了一個寶藏項目&#xff0c; 宣傳是完全從0開始&#xff0c;僅用3塊錢成本 2小時&#xff01;即可訓練出僅為25.8M的超小語言模型MiniMind&#xff0c;最小版本體積是 GPT-3 的 17000&#xff0c;做到最普通的個人GPU也可快速訓練 https://github.com/jingyaogong/minimi…

Spring Boot 與 Spring Integration 整合教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot 與 Spring Integration 整合教程 簡介 Spring Integration 是 Spring 生態系統中用于實現企業集成模式&#xff08;Enterprise Integration Pa…

Nginx 核心配置詳解與性能優化最佳實踐

1.什么是 Nginx&#xff1f; Nginx 是一個高性能的 Web 服務器和反向代理服務器。它輕量、高效&#xff0c;被廣泛用于現代 Web 開發中。 2.為什么前端需要了解 Nginx&#xff1f; ★ 了解 本地開發&#xff1a;可以模擬生產環境 部署前端項目&#xff1a;作為靜態文件服務器…

LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系統、TileMap等全面升級!

正式版推出前&#xff0c;說明3.3的功能還沒開發完。所以&#xff0c;又一大波更新來了~ 下面對重點更新進行說明。 Spine的重要更新 3.3.0-beta.3版本開始&#xff0c;新增了Spine 4.2 的運行時庫&#xff0c;Spine動畫上可以支持物理特性了。例如&#xff0c;下圖右側女孩在啟…

pip安裝timm依賴失敗

在pycharm終端給虛擬環境安裝timm庫失敗&#xff08; pip install timm&#xff09;&#xff0c;提示你要訪問 https://rustup.rs/ 來下載并安裝 Rust 和 Cargo 直接不用管&#xff0c;換一條命令 pip install timm0.6.13 成功安裝 簡單粗暴

BUUCTF-web刷題篇(7)

16.BackupFile 題目提示backupfile&#xff0c;是備份文件的意思&#xff1a; 查看源碼沒有什么有用信息&#xff0c;也沒有登錄界面&#xff0c;所以也不會用到蟻劍鏈接來找備份文件&#xff0c;所以大概率就是通過構造playload來查找備份文件。 注&#xff1a;備份文件常用…

Maven 構建生命周期

Maven 構建生命周期 引言 Maven 是一個強大的項目管理和構建自動化工具,廣泛應用于 Java 開發領域。Maven 的核心概念之一是構建生命周期,它定義了從項目創建到構建、測試、打包、部署等一系列操作的流程。本文將詳細介紹 Maven 的構建生命周期,幫助讀者更好地理解和使用 …

PyTorch 深度學習實戰(29):目標檢測與 YOLOv12 實戰

在上一篇文章中,我們探討了對比學習與自監督表示學習。本文將深入計算機視覺的核心任務之一——目標檢測,重點介紹最新的 YOLOv12 (You Only Look Once v12) 算法。我們將使用 PyTorch 實現 YOLOv12 模型,并在 COCO 數據集上進行訓練和評估。 一、YOLOv12 基礎 YOLOv12 是 …

使用Leaflet對的SpringBoot天地圖路徑規劃可視化實踐-以黃花機場到橘子洲景區為例

目錄 前言 一、路徑規劃需求 1、需求背景 2、技術選型 3、功能簡述 二、Leaflet前端可視化 1、內容布局 2、路線展示 3、轉折路線展示 三、總結 前言 在當今數字化與智能化快速發展的時代&#xff0c;路徑規劃技術已經成為現代交通管理、旅游服務以及城市規劃等領域的…

深入理解 CSS 選擇器:從基礎到高級的樣式控制

引言 在網頁設計與開發中&#xff0c;CSS&#xff08;層疊樣式表&#xff09;扮演著至關重要的角色&#xff0c;它賦予了 HTML 頁面豐富的視覺效果和交互性。而 CSS 選擇器則是 CSS 的核心機制之一&#xff0c;通過選擇器&#xff0c;我們能夠精準地指定要應用樣式的 HTML 元素…

GitHub與Gitee各是什么?它們的區別與聯系是什么?

李升偉 整理 GitHub 介紹 GitHub 是一個基于 Git 的代碼托管平臺&#xff0c;主要用于版本控制和協作開發。它支持多人協作&#xff0c;提供代碼托管、問題跟蹤、代碼審查、項目管理等功能。GitHub 是全球最大的開源社區&#xff0c;許多知名開源項目都在此托管。 主要功能&…

ESLint語法報錯

ESLint語法報錯 運行報錯 You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file.解決方案 關閉eslint的語法檢測&#xff0c;在eslintrc.js文件中…

單例模式與線程安全

目錄 線程安全和重?問題 死鎖和活鎖 死鎖 死鎖四個必要條件 活鎖 STL,智能指針和線程安全 線程安全的單例模式 餓漢模式 懶漢模式 懶漢模式實現單例模式(線程安全版本) 餓漢模式實現單例模式 我們來學習單例模式與線程安全 線程安全和重?問題 線程安全&#xff…

Python+AI提示詞用貝葉斯樣條回歸擬合BSF方法分析櫻花花期數據模型構建跡圖、森林圖可視化

原文鏈接&#xff1a;https://tecdat.cn/?p41308 在數據科學的領域中&#xff0c;我們常常會遇到需要處理復雜關系的數據。在眾多的數據分析方法中&#xff0c;樣條擬合是一種非常有效的處理數據非線性關系的手段。本專題合集圍繞如何使用PyMC軟件&#xff0c;對櫻花花期數據進…