前端內存泄漏

個人簡介

👀個人主頁: 前端雜貨鋪
🙋?♂?學習方向: 主攻前端方向,正逐漸往全干發展
📃個人狀態: 研發工程師,現效力于中國工業軟件事業
🚀人生格言: 積跬步至千里,積小流成江海
🥇推薦學習:🍍前端面試寶典 🎨100個小功能 🍉Vue2 🍋Vue3 🍓Vue2/3項目實戰 🥝Node.js實戰 🍒Three.js
🌕個人推廣:每篇文章最下方都有加入方式,旨在交流學習&資源分享,快加入進來吧

文章目錄

    • 內存泄漏
      • 意外的全局變量
      • 沒有控制好的閉包
      • DOM 泄漏
    • 如何避免內存泄漏

內存泄漏

內存泄漏(Memory Leak)是指程序中已動態分配的堆內存由于某種原因 程序未釋放無法釋放,造成 系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。

意外的全局變量

如下所示代碼,在 test() 回調函數中意外給全局變量賦了值。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><style>.main-content {margin-top: 100px;text-align: center;}#input {width: 200px;height: 50px;}#result {margin-top: 20px;font-size: 28;color: #2cc62c;}</style><body><div><input type="button" id="input" value="添加全局變量" /><div id="result"></div></div></body><script>const test = () => {for (let i = 0; i < 10000; i++) {this[`name${i}`] = i;}};const button = document.getElementById("input");button.addEventListener("click", function () {test();document.getElementById("result").innerHTML = "Done";});</script>
</html>

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述


沒有控制好的閉包

這個例子中的問題是:

  1. 每次點擊按鈕,都會創建10000個閉包函數
  2. 這些閉包被存儲在全局對象 obj 中
  3. 由于沒有清理機制,每次點擊都會累積更多的閉包,導致內存不斷增長
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><style>.main-content {margin: auto;text-align: center;}#input {width: 200px;height: 50px;}#result {margin-top: 20px;font-size: 28;color: #2cc62c;}</style><body><div class="main-content"><input type="button" id="input" value="添加閉包" /><div id="result"></div></div></body><script>function fn() {return function () {return "hello";};}const obj = {};document.getElementById("input").addEventListener("click", function () {for (let i = 0; i < 10000; i++) {obj[`name${i}`] = fn();}document.getElementById("result").innerHTML = "Done";});</script>
</html>

在這里插入圖片描述

DOM 泄漏

div 未被移除。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><style>#container {margin-top: 100px;text-align: center;}#result {margin-top: 20px;font-size: 28;color: #2cc62c;}</style><body><div id="container"><input id="add" type="button" value="add" /><input id="remove" type="button" value="remove" /><div id="wrapper"></div></div></body><script>const wrapper = document.getElementById("wrapper");const removeBtn = document.getElementById("remove");removeBtn.addEventListener("click",function () {const container = document.getElementById("container");container.removeChild(wrapper);},false);const addBtn = document.getElementById("add");addBtn.addEventListener("click",function () {const div = document.createElement("div");div.className = "result";div.innerHTML = "hello";wrapper.appendChild(div);},false);</script>
</html>

在這里插入圖片描述


如何避免內存泄漏

  • 及時清除引用 :當不再需要閉包時,將其設置為null
  • 避免大對象 :不要在閉包中引用大型對象,如果必須使用,考慮在使用后解除引用
  • 使用弱引用 :在適當的場景使用WeakMap和WeakSet
  • 移除事件監聽器 :當不再需要時,使用removeEventListener移除事件監聽器
  • 清除定時器 :使用clearTimeout或clearInterval清除不再需要的定時器
  • 實現緩存過期機制 :對于緩存的閉包,實現LRU或過期時間機制
  • 避免循環引用 :檢查并避免閉包中的循環引用
  • 使用開發工具 :利用Chrome DevTools的Memory面板定期檢查內存使用情況

好啦,本篇文章到這里就要和大家說再見啦,祝你這篇文章閱讀愉快,你下篇文章的閱讀愉快留著我下篇文章再祝!

參考資料:

  1. 百度 · 百科
  2. DeepSeek:DeepSeek
  3. Trae · GPT
  4. 內存泄漏

在這里插入圖片描述


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

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

相關文章

部署zabbox企業級分布式監控

目錄 一、監控系統的基礎認知 2.1 監控的定義與核心價值 2.2 監控的五大類型與五層邏輯架構 &#xff08;1&#xff09;五大監控類型 &#xff08;2&#xff09;五層邏輯架構 2.3 主流開源監控產品對比 二、Zabbix 系統深度解析 3.1 Zabbix 的定位與發展歷程 3.2 Zabb…

時空數據可視化新范式:基于Three.js的生產全流程時間軸回溯技術解析

內容摘要在現代工業生產中&#xff0c;如何高效地管理和分析生產全流程數據是一個關鍵問題。傳統的數據可視化方法往往只能展示靜態的數據快照&#xff0c;難以捕捉和回溯生產過程中的動態變化。然而&#xff0c;基于 Three.js 的時間軸回溯技術為這一難題提供了一種全新的解決…

寶塔面板Nginx報錯: IP+端口可以直接從訪問,反向代理之后就504了 Gateway Time-out

原因表示代理服務器在等待上游服務器&#xff08;即后端服務&#xff09;響應時超時 &#xff1a;<html><head><title>504 Gateway Time-out</title> </head><body><center><h1>504 Gateway Time-out</h1></center&g…

【ComfyUI學習筆記01】下載安裝 | 運行第一個工作流 | 學習思路

【ComfyUI學習筆記01】下載安裝 | 運行第一個工作流 | 學習思路前言下載安裝ComfyUI的下載和安裝ComfyUI Manager 的下載和安裝運行第一個工作流初識節點 (Nodes) 工作流案例1 Image Generation繪制流程圖&#xff0c;確定關鍵節點放置關鍵節點&#xff0c;確定連接順序補充中間…

numpy庫的基礎知識

一.numpy是什么 &#xff1f;Numpy 是 Python 中專門用于高性能數值計算的庫&#xff0c;其核心是一個功能強大的 n 維數組對象&#xff08;ndarray&#xff09;&#xff0c;可以用來存儲和操作大規模的數字矩陣或張量數據。numpy庫的作用&#xff1a;核心功能&#xff1a;實現…

在UniApp中防止頁面上下拖動的方法

1、pages.json中在某個頁面設置禁用彈性滾動的頁面 {"path": "pages/yourPage/yourPage","style": {"app-plus": {"bounce": "none"}} } 2、 pages.json中在所有頁面設置禁用彈性滾動的頁面 {"globalStyl…

LinkedList的模擬實現(雙向鏈表Java)

一&#xff1a;結構LinkedList的底層是雙向鏈表結構(鏈表后面介紹)&#xff0c;由于鏈表沒有將元素存儲在連續的空間中&#xff0c;元素存儲在單獨的節點中&#xff0c;然后通過引用將節點連接起來了&#xff0c;因此在在任意位置插入或者刪除元素時&#xff0c;不需要搬移元素…

Shopify 知識點

&#x1f4dc; 一、Liquid模板語言&#xff08;核心基礎&#xff09;語法結構 ? 輸出變量&#xff1a;{{ product.title }} 動態顯示商品標題。 ? 邏輯控制&#xff1a;{% if product.available %}…{% endif %} 條件渲染。 ? 循環遍歷&#xff1a;{% for item in collectio…

Web LLM 安全剖析:以間接提示注入為核心的攻擊案例與防御體系

文章目錄1 間接提示注入2 訓練數據中毒為什么會出現這種漏洞&#xff1f;3 泄露敏感訓練數據攻擊者如何通過提示注入獲取敏感數據&#xff1f;為什么會出現這種泄露&#xff1f;4 漏洞案例間接提示注入利用 LLM 中的不安全輸出處理5 防御 LLM 攻擊把LLM能訪問的API當成“公開接…

ElasticSearch:不停機更新索引類型(未驗證)

文章目錄**一、前期準備****1. 集群健康檢查****2. 備份數據****3. 監控系統準備****二、創建新索引并配置****1. 設計新索引映射****2. 創建讀寫別名****三、全量數據遷移****1. 執行初始 Reindex****2. 監控 Reindex 進度****四、增量數據同步****1. 方案選擇****五、雙寫切換…

python學智能算法(二十七)|SVM-拉格朗日函數求解上

【1】引言 前序學習進程中&#xff0c;我們已經掌握了支持向量機算法中&#xff0c;為尋找最佳分割超平面&#xff0c;如何用向量表達超平面方程&#xff0c;如何為超平面方程建立拉格朗日函數。 本篇文章的學習目標是&#xff1a;求解SVM拉格朗日函數。 【2】求解方法 【2.…

mac安裝node的步驟

適用于macOS 10.15及以上版本。 前提條件 macOS版本&#xff1a;確保系統為macOS 10.15&#xff08;Catalina&#xff09;或更高版本。可在“蘋果菜單 > 關于本機”查看。管理員權限&#xff1a;部分安裝可能需要管理員權限。網絡連接&#xff1a;需要聯網下載安裝包或工具…

【LeetCode數據結構】棧的應用——有效的括號問題詳解

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#xff0c;為生民立命&#xff0c;為…

多尺度卷積模型:Inception塊

在GoogLeNet中&#xff0c;基本的卷積塊被稱為Inception塊&#xff08;Inception block&#xff09;。 使用窗口大小為11&#xff0c;33&#xff0c;551\times1&#xff0c;3\times3&#xff0c;5\times511&#xff0c;33&#xff0c;55的卷積層&#xff0c;從不同空間大小中提…

Android 默認圖庫播放視頻沒有自動循環功能,如何添加

Android 默認圖庫播放視頻沒有自動循環功能, 如何添加 按如下方式添加 開發云 - 一站式云服務平臺 .../apps/Gallery2/res/values-zh-rCN/strings.xml | 3 ++ packages/apps/Gallery2/res/values/strings.xml | 3 ++ .../com/android/gallery3d/app/MovieActivity…

7月21日總結

命令執行 RCE RCE&#xff08;remote code execute&#xff09;&#xff1a;遠程命令執行或者代碼執行&#xff0c;我們平時說的rce&#xff0c;比如thinkPHP的 rce漏洞&#xff0c;即算代碼注入漏洞&#xff0c;也算rce漏洞&#xff0c;因為滲透的最終情況可以實現執行命令或…

Linux——自制shell命令行解釋器

文章目錄1.打印命令提示符2.獲取用戶輸入指令3.重定向分析4.命令行參數表,環境變量表,初始化5.命令解析6.命令執行6.1.創建子進程6.2 處理內建命令6.3 文件重定向7.源碼前言 在實現shell的時候我們先創建自己myshell目錄&#xff0c;在目錄中創建myshell.cc文件&#xff0c;因…

Boost庫智能指針boost::shared_ptr詳解和常用場景使用錯誤示例以及解決方法

1、Boost智能指針 —— boost::shared_ptr 詳解一、什么是 boost::shared_ptr boost::shared_ptr 是 Boost 庫中實現的一個智能指針模板類&#xff0c;用于管理動態分配的對象生命周期&#xff0c;采用引用計數機制。多個 shared_ptr 實例可以共享同一個對象的所有權&#xff0…

科學分析指南,如何快速找到并清理磁盤的無用文件

隨著時間的推移&#xff0c;系統中會積累大量的臨時文件、緩存文件、不再需要的安裝包或其他大型文件。磁盤清理可以刪除這些不必要的文件&#xff0c;從而釋放寶貴的磁盤空間。它無需安裝&#xff0c;插上 U 盤就能直接使用。只需勾選需要掃描的磁盤&#xff0c;點擊“開始分析…

Laravel 系統版本查看及artisan管理員密碼找回方法針對各個版本通用方法及原理-優雅草卓伊凡

Laravel 系統版本查看及artisan管理員密碼找回方法針對各個版本通用方法及原理-優雅草卓伊凡一、查看 Laravel 版本的方法優雅草蜻蜓T會議系統專業版 最近又有客戶要了&#xff0c;但是發現 密碼不對 管理員賬戶密碼不對&#xff0c;卓伊凡必須處理下&#xff0c;這里順便講解密…