国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript垃圾回收機制 - 標記清除法/引用計數/V8機制

JellyBool / 3795人閱讀

摘要:例如,和中的對象就是實現的對象,而對象的垃圾收集機制采用的是引用計數策略。因此,即使中的引擎使用標記清除策略實現,但是訪問的對象依然是基于引用計數策略的。垃圾回收器從不移動大對象。

Js GC原理:

找出那些不再繼續使用的變量,然后釋放其所占用的內存,垃圾回收器會按照固定的時間間隔周期性地執行這一操作

Js GC 策略:

標記清除法

引用計數

JavaScript 內存分配:

定義變量時就完成了內存分配,還可以通過函數調用分配內存,使用值的過程實際上是對分配內存進行讀取與寫入的操作

標記清除法:

標記方式:特殊位的反轉、維護一個列表

原理:垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記,然后它會去掉環境中的變量已經被環境中變量被標記為引用的變量,在此之后再被標記的變量將被視為準備刪除的變量。最后垃圾回收器清除標記的變量,回收它們所占用的內存空間

目前主流瀏覽器都是使用標記清除式的垃圾回收策略,只不過收集的間隔有所不同

引用計數:

原理:每次引用加一,被釋放時減一,當這個值的引用次數變成 0 時,就可以將其內存空間回收

缺點:循環引用(obj1 和 obj2 通過各自的屬性相互引用,也就是說,這兩個對象的引用次數都是 2)

IE兼容問題

在 IE9 之前,IE 中有一部分對象并不是原生 JavaScript 對象。例如,BOM 和 DOM 中的對象就是 C++ 實現的 COM 對象,而 COM 對象的垃圾收集機制采用的是引用計數策略。因此,即使 IE 中的 JavaScript 引擎使用標記清除策略實現,但是 JS 訪問的 COM 對象依然是基于引用計數策略的。可以在 IE 中涉及到 COM 對象,就會存在循環引用的問題

解決:將變量設置為 null

V8內存機制

V8 引擎會限制 JavaScript 所能使用的內存大小

性能問題:(運行時間間隔)

IE7 之前的垃圾收集器是根據內存分配量運行的,達到某一個臨界值就是啟動垃圾回收器

缺點:如果該腳本在其生命周期需要一直保持這么多變量,垃圾回收器就不得不頻繁運行。

瀏覽器可自動觸發: window.CollectGarbage()

避免:執行代碼中只保留必要的數據,一旦數據不再有用,通過設置為 null 來釋放其引用(適用于大多數全局變量和全局對象的屬性)

V8 的堆構成

新生區:大多數對象被分配在這里。新生區是一個很小的區域,垃圾回收在這個區域非常頻繁,與其他區域相獨立。

老生指針區:這里包含大多數可能存在指向其他對象的指針的對象。大多數在新生區存活一段時間之后的對象都會被挪到這里。

大對象區:這里存放體積超越其他區大小的對象。每個對象有自己 map 產生的內存。垃圾回收器從不移動大對象。
-代碼區:代碼對象,也就是包含 JIT 之后指令的對象,會被分配到這里。這是唯一擁有執行權限的內存區(不過如果代碼對象因過大而放在大對象區,則該大對象所對應的內存也是可執行的。譯注:但是大對象內存區本身不是可執行的內存區)。
-Cell 區、屬性 Cell 區、Map 區:這些區域存放 Cell、屬性 Cell 和 Map,每個區域因為都是存放相同大小的元素,因此內存結構很簡單

分代回收

原因:絕大多數對象的生存期很短,只有某些對象的生存期較長

過程:

1、對象起初會被分配在新生區(通常很小,只有 1-8 MB)在新生區的內存分配非常容易:我們只需保有一個指向內存區的指針,不斷根據新對象的大小對其進行遞增即可。當該指針達到了新生區的末尾,就會有一次清理(小周期),清理掉新生區中不活躍的死對象。

2、活躍超過 2 個小周期的對象,則需將其移動至老生區老生區在標記-清除或標記-緊縮(大周期)的過程中進行回收。大周期進行的并不頻繁。一次大周期通常是在移動足夠多的對象至老生區后才會發生。至于足夠多到底是多少,則根據老生區自身的大小和程序的動向來定。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/109792.html

相關文章

  • JS專題之垃圾回收

    摘要:如果沒有引用指向該對象零引用,對象將被垃圾回收機制回收。經過增量標記改進后,垃圾回收的最大停頓時間可以減少到原來的左右。解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。 前言 在講 JS 的垃圾回收(Garbage Collection)之前,我們回顧上一篇《JS專題之memoization》,memoization 的原理是以參數作為 key,函數結果作為 v...

    liujs 評論0 收藏0
  • Node(V8)的垃圾回收機制

    摘要:基本概念垃圾回收機制。對兩個不同生代的不同垃圾回收策略構成了整個的垃圾回收機制。此種方式會導致下一次內存中產生大量碎片,即內存空間不連續,導致內存分配時面對大對象可能會無法滿足,提前出發下一次的垃圾回收機制。 : 聊一聊垃圾回收機制吧。 : 恩,垃圾回收是自動的。 基本概念 GC(Garbage collection)垃圾回收機制。目的是解釋器去判別需要回收的內容,當解釋器認為一個占...

    suxier 評論0 收藏0
  • V8引擎】淺析Chrome V8引擎中的垃圾回收機制和內存泄露優化策略

    摘要:一前言的垃圾回收機制使用垃圾回收機制來自動管理內存。垃圾回收器只會針對新生代內存區老生代指針區以及老生代數據區進行垃圾回收。分別對新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實現了準確式 GC,GC 算法采用了分代式垃圾回收機制。因此,V8 將內存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機制:JavaScript使用垃圾回收機制來自動管理內存。垃...

    qingshanli1988 評論0 收藏0
  • JavaScript 垃圾回收

    摘要:根據的定義,垃圾回收是一種自動的內存管理機制。但在沒有結束前,回調函數里的變量以及回調函數本身都無法被回收。在內存泄漏部分,我們討論了無意的全局變量會帶來無法回收的內存垃圾。 根據 Wiki 的定義,垃圾回收是一種自動的內存管理機制。當計算機上的動態內存不再需要時,就應該予以釋放,以讓出內存。直白點講,就是程序是運行在內存里的,當聲明一個變量、定義一個函數時都會占用內存。內存的容量是有...

    BothEyes1993 評論0 收藏0
  • 【進階1-4期】JavaScript深入之帶你走進內存機制

    摘要:引擎對堆內存中的對象進行分代管理新生代存活周期較短的對象,如臨時變量字符串等。內存泄漏對于持續運行的服務進程,必須及時釋放不再用到的內存。 (關注福利,關注本公眾號回復[資料]領取優質前端視頻,包括Vue、React、Node源碼和實戰、面試指導) 本周正式開始前端進階的第一期,本周的主題是調用堆棧,今天是第4天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了解本進階計劃...

    不知名網友 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<