JS高程4.變數,作用域和記憶體問題(3)垃圾收集

来源:http://www.cnblogs.com/LinSL/archive/2016/12/15/6181436.html
-Advertisement-
Play Games

JavaScript的自動垃圾收集機制 執行環境會負責管理代碼執行過程中使用的記憶體,編寫JavaScript程式時,所需記憶體的分配以及無用記憶體的回收完全實現自動管理。 原理: 找出那些不再繼續使用的變數,然後釋放其占用的記憶體。為此,垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間)周期性地 ...


JavaScript的自動垃圾收集機制

  執行環境會負責管理代碼執行過程中使用的記憶體,編寫JavaScript程式時,所需記憶體的分配以及無用記憶體的回收完全實現自動管理。

原理:

  找出那些不再繼續使用的變數,然後釋放其占用的記憶體。為此,垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間)周期性地執行這一操作。

 

垃圾收集的方式:

1.標記清除(mark-and-sweep)

  最常用的垃圾收集方式。當變數進入環境時,就將變數標記為“進入環境”。從邏輯上講,永遠不能釋放進入環境的變數所占用的記憶體,因為只要執行流進入相應的環境,就可能會用到它們。當變數離開環境時,則將其標記為“離開環境”。

  立即收集器在運行時會給存儲在記憶體中的所有變數都加上標記,然後它會去掉環境中的變數以及被環境中的變數引用的變數的標記。剩下的在被加上標記的變數將被視為準備刪除的變數,原因是環境中的變數已經無法訪問到這些變數。最後,垃圾收集器完成記憶體清除,銷毀那些帶有標記的值並收回它們所占用的記憶體空間。

 

2.引用計數(reference counting)

  跟蹤記錄每個值被引用的次數,當這個值的引用次數為0時,說明沒有辦法再訪問這個值了,因而就可以將其占用的記憶體空間回收回來。當垃圾收集器下次再運行時,會釋放那些引用次數為零的值所占用的記憶體。

(1)應用機制存在一個問題:迴圈引用。

  迴圈引用是指對象A中包含一個指向對象B的指針,而對象B中也包含一個指向對象A的引用。(這樣它們的引用可能永遠不為0,如果函數被重覆多次調用,就會導致大量的記憶體得不到回收。)

(2)IE中的BOM和DOM中的對象使用C++以COM(component Object Model,組件對象模型)對象的形式實現,而COM對象的垃圾收集機制採用的是引用計數策略。

以下是COM對象導致的迴圈引用的問題:

eg:

 

1 var element=document.getElementById("some_element");
2     var myObject=new Object();
3     myObject.element=element;
4     element.someObject=myObject;

 

  上面的例子在一個DOM元素(element)和一個原生JavaScript對象(myObject)之間創建了迴圈引用。由於存在這個迴圈引用,即使將例子中的DOM從頁面移除,它也永遠不會被回收。

 

可以使用以下代碼手工斷開原生JavaScript和DOM元素之間的鏈接:

1 myObject.element=null;
2     element.someObject=null;

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.原生ajax get請求和post請求區別:黃色小三角 以get請求為例,輸出結果如下: 2.jquery中的ajax 列了常用的6個方法: 3.狀態說明 readystate: 0:請求未初始化,open未調用 1:伺服器連接已建立,open已經調用了 2:請求已接受,也就是接收到頭信息了 3 ...
  • 冒泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。 它重覆地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重覆地進行直到沒有再需要交換,也就是說該數列已經排序完成。 這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂 ...
  • jQuery就是用原生js寫出的框架集(Write less do more ) 1.需要註意的問題?(1).jQuery語法需要重新學習(2).jQuery需要註意版本之間的相容性 (3)不是越新的版本越好(要穩定)(4)jQuery一般有兩個版本(xxx.min.js和xxx.js) 區別就是去 ...
  • 今天做了兩個靜態html頁面,在瀏覽器中測試的時候,發現其中一個html頁面的頂部多出了些許空白,而另一個頁面顯示正常。在瀏覽器中進行了審查對比,發現有空白的那個頁面的head標簽裡面的元素全部跑到了body裡面,而且body中還多出了一個,當把這個東西刪除之後就正常了。然後又在編輯器中,對比了一下 ...
  • 原文地址:https://mobxjs.github.io/mobx/getting-started.html 寫在前面:本人英語水平有限,主要是寫給自己看的,若有哪位同學看到了有問題的地方,請為我指出,非常感謝; mobx是一個比redux更好的狀態管理包,代碼量更少,思路更清晰,沒有像redux ...
  • 最近在自行研究JavaScript以及相關的知識,由於沒有在網上能找到非常細緻的相關知識,所以購買了JavaScript權威指南一書(第六版)。不得不說,人家淘寶團隊真是厲害,厚厚一大本,翻譯的非常不錯,更好的是內容非常詳細。值得有經驗的開發人員觀看。對於這個書的贊美就不說辣麽多了,回到正題。 在之 ...
  • 一、jQuery MobilejQuery Mobile 是jQuery在移動設備上的版本,做為主要針對移動設備的框架來說,它提供一個移動設備平臺統一的介面來相容不同的移動平臺,其特性包括:1.簡單易用2.漸進增強和優雅降級3.Accessibility4.小規模5.主題設置6.跨平臺學習容易,資料... ...
  • 公司里的項目由於發展較快,很多東西都沒有好好梳理一下,以至於有很多的潛在的問題。 最近就遇到了一個比較坑的問題。datepicker 有兩個插件庫中的datepicker插件比較有名。一個是jQuery-UI,一個是bootstrap。兩個的api網址分別是 然而在項目中很不巧的兩個庫都用到了。然後 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...