JavaScript的垃圾回收機制

No.內容鏈接
1Openlayers 【入門教程】 - 【源代碼+示例300+】
2Leaflet 【入門教程】 - 【源代碼+圖文示例 150+】
3Cesium 【入門教程】 - 【源代碼+圖文示例200+】
4MapboxGL【入門教程】 - 【源代碼+圖文示例150+】
5前端就業寶典 【面試題+詳細答案 1000+】

在這里插入圖片描述

文章目錄

    • 一、垃圾回收基本原理
      • 1、 標記-清除(Mark-and-Sweep)
      • 2、引用計數
    • 二、示例代碼
    • 三、注意事項
    • 四、小技巧


JavaScript的垃圾回收機制是自動管理內存分配和釋放的過程,它主要通過兩種策略實現:標記-清除(Mark-and-Sweep)和引用計數(Reference Counting)。現代JavaScript引擎如V8(Chrome和Node.js中使用)和SpiderMonkey(Firefox中使用)主要采用標記-清除算法,并在此基礎上做了優化,如增量標記、分代回收等。以下是對垃圾回收的詳細解釋、示例代碼以及注意事項。

一、垃圾回收基本原理

1、 標記-清除(Mark-and-Sweep)

  1. 標記階段:從根對象(全局變量、當前執行上下文中的變量等)出發,遍歷所有可達的對象,將它們標記為活動的。
  2. 清除階段:遍歷堆內存,未被標記的對象被認為是垃圾,可以被回收。

2、引用計數

  • 每個對象都有一個引用計數,每當有新的引用指向它時計數加1,引用消失時減1。
  • 當計數降為0時,對象被視為垃圾可回收。

二、示例代碼

let obj = { data: "Hello" }; // 創建一個對象,分配內存
let ref = obj; // 增加一個引用,引用計數為2
obj = null; // 解除一個引用,但因為ref還存在,所以引用計數為1,對象不會被回收
ref = null; // 現在引用計數為0,理論上在引用計數策略下可以回收
// 實際上,現代JavaScript引擎會采用標記-清除,因此不依賴引用計數,但示例展示了基本概念。

三、注意事項

  1. 循環引用:兩個或更多對象相互引用,即使不再被外部引用也可能阻止垃圾回收。現代JavaScript引擎通過周期收集機制解決這個問題,但設計時仍應避免不必要的循環引用。

    let objA = {};
    let objB = {};
    objA.ref = objB; // A引用B
    objB.ref = objA; // B引用A
    objA = null;
    objB = null; // 兩個對象互相引用,但已斷開外部連接,現代引擎可以處理這種循環引用。
    
  2. 性能影響:垃圾回收過程會消耗CPU資源,特別是在進行全量回收時可能導致應用暫停(STWASM)。優化代碼減少不必要的對象創建和及時釋放引用可以減輕這一影響。

  3. 內存泄漏:長時間運行的應用,特別是涉及大量DOM操作、定時器、閉包(closures)、事件監聽器時,要特別注意避免內存泄漏。

  4. 現代引擎優化:了解并利用現代JavaScript引擎的特性,如V8的分代垃圾回收,年輕代(頻繁回收短期對象)和老年代(較少回收長期對象)的區分,可以提高內存管理效率。

四、小技巧

  • 使用工具:利用瀏覽器開發者工具中的內存分析工具(如Chrome DevTools的Memory面板)來檢測內存泄漏。
  • 避度量與監控:對于復雜的Web應用,實施性能監控和內存使用度量,定期檢查是否有不正常的增長趨勢。
  • 代碼模式:遵循良好的編程實踐,比如使用WeakMap和WeakSet來存儲大型數據結構的引用,避免不必要的強引用。

理解垃圾回收機制,并在開發中合理應用這些知識,有助于編寫內存高效、性能優越的JavaScript應用。

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

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

相關文章

匹配字符串

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python提供了re模塊,用于實現正則表達式的操作。在實現時,可以使用re模塊提供的方法(如search()、match()、finda…

深入理解Redis:多種操作方式詳解

Redis(Remote Dictionary Server)是一款高性能的開源鍵值存儲系統,廣泛應用于緩存、會話管理、實時分析等領域。它支持多種數據結構,如字符串、哈希、列表、集合和有序集合等,提供了豐富的操作命令。本篇博客將詳細介紹…

信息系統項目管理師0603:項目整合管理 — 考點總結(可直接理解記憶)

點擊查看專欄目錄 文章目錄 項目整合管理 — 考點總結(可直接理解記憶) 輸入、輸出、工具和技術 歷年考題直接考輸入,輸出、工具和技術的有17年11月第34、35,19年5月第34、35,20年11月27、28,21年5月第26,28,21年11月第28,22年5月第25,22年11月第22考題 項目章程是正…

CasaOS玩客云安裝全平臺高速下載器Gopeed并實現遠程訪問

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

BufferQueue 的工作原理

bufferQueue 是 Android 圖形棧中的一個核心組件,它在生產者和消費者之間傳遞緩沖區(buffer)。它通常用于圖形緩沖區管理,特別是在 SurfaceFlinger 和其他圖形相關的組件中。理解 BufferQueue 的工作原理對開發高性能圖形應用和解決圖形渲染問題非常有幫助。 BufferQueue …

基于Python的酒店客房入侵檢測系統的設計與實現

基于Python的酒店客房入侵檢測系統的設計與實現 開發語言:Python 數據庫:MySQL所用到的知識:Django框架工具:pycharm、Navicat、Maven 系統功能實現 酒店客房入侵管理界面 結合上文的結構搭建和用戶需求,酒店客房入侵檢測系統的…

【Unity Shader入門精要 第12章】屏幕后處理效果(一)

1. 原理和過程 屏幕后處理是綁定攝像機的,通過抓取當前攝像機渲染的圖像作為 SrcTextrue,然后按需依次調用處理接口,對 SrcTexture 進行處理,最后將處理完成的 DstTexture 顯示到屏幕上,整個過程的調度通過 C# 腳本完…

使用 C++ 在當前進程中獲取指定模塊的基址

C 實現 , 獲取指定模塊在該進程中的基址 1、流程: 獲取進程的所有模塊信息–>遍歷模塊列表 2、實現: // 我自己定義的 typedef struct moudle_date_ {HANDLE mhandle; // 句柄char mname[64]; // 名稱char* date; // 數據DWORD mdword; // 基址…

【機器學習】Adaboost: 強化弱學習器的自適應提升方法

🌈個人主頁: 鑫寶Code 🔥熱門專欄: 閑話雜談| 炫酷HTML | JavaScript基礎 ?💫個人格言: "如無必要,勿增實體" 文章目錄 Adaboost: 強化弱學習器的自適應提升方法引言Adaboost基礎概念弱學習器與強學習…

存儲器容量小才使用SRAM芯片,容量較大時使用DRAM芯片。為什么?

在計算機系統中,存儲器容量的選擇涉及到多種因素,包括成本、速度和復雜性。SRAM(靜態隨機存取存儲器)和DRAM(動態隨機存取存儲器)是兩種常見的內存類型,它們在設計和應用上有顯著的不同。以下是…

【藍橋杯嵌入式】 第六屆國賽

目錄 題目 配置 注意事項 代碼 - 默寫大師 EEPROM讀寫函數 LED驅動函數 ADC采集 上電初始化 LCD 按鍵 PWM互補輸出 全部代碼 hardware.c hardware.h control.c control.h main.c 題目 配置 注意事項 復制LCD的工程,先配置資源 --- 勾選完選項一…

CCIG 2024:合合信息文檔解析技術突破與應用前景

目錄 背景當前大模型訓練和應用面臨的問題訓練Token耗盡訓練語料質量要求高LLM文檔問答應用中文檔解析不精準 合合信息的文檔解析技術1. 具備多文檔元素識別能力2. 具備版面分析能力3. 高性能的文檔解析4. 高精準、高效率的文檔解析文檔多板式部分示例 文檔解析典型技術難點元素…

【代碼隨想錄Day23】|669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹

669. 修剪二叉搜索樹 這題最開始的想法是復用刪除節點的那題的思路做,需要修改的部分就是要讓程序刪除完一個點后繼續遍歷,因為后續可能還有不符合條件的節點。但這樣想也做復雜了。 這類題其實不用想用什么序遍歷,用哪種方式只是為了更好的…

案例|開發一個美業小程序,都有什么功能

隨著移動互聯網的迅猛發展,美業連鎖機構紛紛尋求數字化轉型,以小程序為載體,提升服務效率,增強客戶體驗。 線下店現在面臨的困境: 客戶到店排隊時間過長,體驗感受差 新客引流難,老用戶回頭客…

基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發(MPLAB+ADC)

目錄 項目介紹硬件介紹項目設計開發環境及工程參考總體流程圖硬件基本配置光照傳感器讀取定時器檢測邏輯 功能展示項目總結 👉 【Funpack3-2】基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發 👉 Github: EmbeddedCamerata/PIC-IOT_finger_recognition 項…

Flutter基礎 -- Dart 語言 -- 注釋函數表達式

目錄 1. 注釋 1.1 單行注釋 1.2 多行注釋 1.3 文檔注釋 2. 函數 2.1 定義 2.2 可選參數 2.3 可選參數 默認值 2.4 命名參數 默認值 2.5 函數內定義 2.6 Funcation 返回函數對象 2.7 匿名函數 2.8 作用域 3. 操作符 3.1 操作符表 3.2 算術操作符 3.3 相等相關的…

上海亞商投顧:滬指沖高回落 兩市成交金額僅剩7000億

上海亞商投顧前言:無懼大盤漲跌,解密龍虎榜資金,跟蹤一線游資和機構資金動向,識別短期熱點和強勢個股。 一.市場情緒 三大指數昨日沖高回落,午后一度集體翻綠,臨近尾盤小幅回升。光伏產業鏈再度走強&#…

aws 在ecs外部實例上運行gpu負載

參考資料 https://docs.amazonaws.cn/zh_cn/AmazonECS/latest/developerguide/ecs-gpu.htmlhttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#gpu-instanceshttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/install-nvidia-drive…

LeetCode 63.不同路徑Ⅱ

思路&#xff1a; 在有障礙物的地方增加一個判斷即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

K8s集群之 存儲卷 PV PVC

目錄 默寫 1 如何將pod創建在指定的Node節點上 2 污點的種類(在node上設置) 一 掛載存儲??????? 1 emptyDir存儲卷 2 hostPath存儲卷 ①在 node01 節點上創建掛載目錄 ② 在 node02 節點上創建掛載目錄 ③ 創建 Pod 資源 ④ 在master上檢測一下&#xff1a;…