js的垃圾回收機制

来源:https://www.cnblogs.com/mayun0504/archive/2019/04/03/10646620.html
-Advertisement-
Play Games

Js具有自動垃圾回收機制。垃圾收集器會按照固定的時間間隔周期性的執行。 JS中最常見的垃圾回收方式是標記清除。 工作原理:是當變數進入環境時,將這個變數標記為“進入環境”。當變數離開環境時,則將其標記為“離開環境”。標記“離開環境”的就回收記憶體。 工作流程: 1. 垃圾回收器,在運行的時候會給存儲在 ...


       Js具有自動垃圾回收機制。垃圾收集器會按照固定的時間間隔周期性的執行。

JS中最常見的垃圾回收方式是標記清除。

工作原理:是當變數進入環境時,將這個變數標記為“進入環境”。當變數離開環境時,則將其標記為“離開環境”。標記“離開環境”的就回收記憶體。

工作流程:

1.    垃圾回收器,在運行的時候會給存儲在記憶體中的所有變數都加上標記。

2.    去掉環境中的變數以及被環境中的變數引用的變數的標記。

3.    再被加上標記的會被視為準備刪除的變數。

4.    垃圾回收器完成記憶體清除工作,銷毀那些帶標記的值並回收他們所占用的記憶體空間。

引用計數 方式

工作原理:跟蹤記錄每個值被引用的次數。

工作流程:

1.    聲明瞭一個變數並將一個引用類型的值賦值給這個變數,這個引用類型值的引用次數就是1。

2.    同一個值又被賦值給另一個變數,這個引用類型值的引用次數加1.

3.    當包含這個引用類型值的變數又被賦值成另一個值了,那麼這個引用類型值的引用次數減1.

4.    當引用次數變成0時,說明沒辦法訪問這個值了。

5.    當垃圾收集器下一次運行時,它就會釋放引用次數是0的值所占的記憶體。

但是迴圈引用的時候就會釋放不掉記憶體。迴圈引用就是對象A中包含另一個指向對象B的指針,B中也包含一個指向A的引用。

因為IE中的BOM、DOM的實現使用了COM,而COM對象使用的垃圾收集機制是引用計數策略。所以會存在迴圈引用的問題。

解決:手工斷開js對象和DOM之間的鏈接。賦值為null。IE9把DOM和BOM轉換成真正的JS對象了,所以避免了這個問題。

什麼情況會引起記憶體泄漏?
雖然有垃圾回收機制但是我們編寫代碼操作不當還是會造成記憶體泄漏。

1.    意外的全局變數引起的記憶體泄漏。

原因:全局變數,不會被回收。

解決:使用嚴格模式避免。

2.    閉包引起的記憶體泄漏

原因:閉包可以維持函數內局部變數,使其得不到釋放。

解決:將事件處理函數定義在外部,解除閉包,或者在定義事件處理函數的外部函數中,刪除對dom的引用。

3.    沒有清理的DOM元素引用

原因:雖然別的地方刪除了,但是對象中還存在對dom的引用

解決:手動刪除。

4.    被遺忘的定時器或者回調

原因:定時器中有dom的引用,即使dom刪除了,但是定時器還在,所以記憶體中還是有這個dom。

解決:手動刪除定時器和dom。

5.    子元素存在引用引起的記憶體泄漏

原因:div中的ul li  得到這個div,會間接引用某個得到的li,那麼此時因為div間接引用li,即使li被清空,也還是在記憶體中,並且只要li不被刪除,他的父元素都不會被刪除。

解決:手動刪除清空。

 

什麼放在記憶體中?什麼不放在記憶體中?
基本類型是:Undefined/Null/Boolean/Number/String

基本類型的值存在記憶體中,被保存在棧記憶體中。從一個變數向另一個變數複製基本類型的值,會創建這個值的一個副本。

引用類型:object

引用類型的值是對象,保存在堆記憶體中。

1.    包含引用類型值的變數實際上包含的並不是對象本身,而是一個指向該對象的指針。從一個變數向另一個變數複製引用類型的值,複製的其實是指針,因此兩個變數最終都指向同一個對象。

2.    js不允許直接訪問記憶體中的位置,也就是不能直接訪問操作對象的記憶體空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。

 

棧和堆的區別
  一、堆棧空間分配區別:
  1、棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧;
  2、堆(操作系統): 一般由程式員分配釋放,若程式員不釋放,程式結束時可能由OS回收,分配方式倒是類似於鏈表。
  二、堆棧緩存方式區別:
  1、棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放;
  2、堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
  三、堆棧數據結構區別:
  堆(數據結構):堆可以被看成是一棵樹,如:堆排序;
  棧(數據結構):一種先進後出的數據結構。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 快捷鍵 ctrl+l 清屏 ctrl +a 回到行首 ctrl + e 回到行末 資料庫操作 進入資料庫 方式1 mysql -u用戶名 -p 密碼 直接輸入密碼,缺點,會暴露自己的密碼哦😝 方式2 mysql -u用戶名 -p 回車後輸入密碼 主要內容:查詢 1、查詢當前所有的資料庫 show ...
  • 文章大綱 一、OkHttp簡介二、OkHttp簡單使用三、OkHttp封裝四、項目源碼下載 一、OkHttp簡介 1. 什麼是OkHttp 一般在Java平臺上,我們會使用Apache HttpClient作為Http客戶端,用於發送 HTTP 請求,並對響應進行處理。比如可以使用http客戶端與第 ...
  • 文章大綱 一、什麼是RxJava二、為什麼要用RxJava三、RxJava使用詳解四、項目源碼下載五、參考文章 一、什麼是RxJava Rx(Reactive Extensions)是一個庫,用來處理事件和非同步任務,在很多語言上都有實現,RxJava是Rx在Java上的實現。簡單來說,RxJava就 ...
  • 在Android開發中,存儲(Storage)的方式根據具體的需求不同而不同,例如數據對應用程式是私有的還是其他應用程式(和用戶)可以訪問的,以及保存數據需要多大的空間。 ...
  • weight:重量、權重。 當我們給一個view設置了android:layout_weight屬性,意味著賦予它話語權,常規思維就是誰的weight大,誰說了算(空間占比大)。 下麵我們來看下具體的代碼: 兩個Button的寬度設置的是wrap_content,此時weight屬性使LinearL ...
  • 一.首先來到夜神模擬器的安裝目錄下 如下圖所示: 再把這整個文件夾添加到我們的windows環境變數里。然後再把android studio 和夜神模擬器都打開,註意必須同時打開而且不能夠把夜神模擬器最小化!! 第二步.打開cmd、 輸入adb,如果命令行模式有adb的使用說明,則說明配置變數成功, ...
  • /** * 判斷鍵盤是否顯示 * * @return true 顯示 */public static boolean isSoftShowing(Activity activity) { //獲取當前屏幕內容的高度 int screenHeight = activity.getWindow().ge ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...