亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS堆棧內(nèi)存的運行機制詳解

 更新時間:2022年06月18日 09:03:13   作者:Gaby  
棧內(nèi)存主要用于存儲各種基本類型的變量,包括Boolean、Number、String、Undefined、Null,以及對象變量的指針(地址值),這篇文章主要介紹了JS堆棧內(nèi)存的運行機制,需要的朋友可以參考下

在js引擎中對變量的存儲主要有兩個位置,堆內(nèi)存和棧內(nèi)存。棧內(nèi)存主要用于存儲各種基本類型的變量,包括Boolean、Number、String、Undefined、Null,以及對象變量的指針(地址值)。棧內(nèi)存中的變量一般都是已知大小或者有范圍上限的,算作一種簡單存儲。而堆內(nèi)存主要負責(zé)像對象Object這種變量類型的存儲,對于大小這方面,一般都是未知的。

棧內(nèi)存 ECStack

棧內(nèi)存ECStack(Execution Context Stack)(作用域)

JS之所以能夠在瀏覽器中運行,是因為瀏覽器給JS提供了執(zhí)行的環(huán)境棧內(nèi)存

瀏覽器會在計算機內(nèi)存中分配一塊內(nèi)存,專門用來供代碼執(zhí)行=》棧內(nèi)存ECStack(Execution Context Stack)執(zhí)行環(huán)境棧,每打開一個網(wǎng)頁都會生成一個全新的ECS

ECS的作用

  • 提供一個供JS代碼自上而下執(zhí)行的環(huán)境(代碼都在棧中執(zhí)行)
  • 由于基本數(shù)據(jù)類型值比較簡單,他們都是直接在棧內(nèi)存中開辟一個位置,把值直接存儲進去的,當棧內(nèi)存被銷毀,存儲的那些基本值也都跟著銷毀

堆內(nèi)存

堆內(nèi)存:引用值對應(yīng)的空間,堆內(nèi)存是區(qū)別于棧區(qū)、全局數(shù)據(jù)區(qū)和代碼區(qū)的另一個內(nèi)存區(qū)域。堆允許程序在運行時動態(tài)地申請某個大小的內(nèi)存空間。

存儲引用類型值(對象:鍵值對, 函數(shù):代碼字符串),當內(nèi)存釋放銷毀,那么這個引用值徹底沒了 堆內(nèi)存釋放

當堆內(nèi)存沒有被任何得變量或者其他東西所占用,瀏覽器會在空閑的時候,自主進行內(nèi)存回收,把所有不被占用得內(nèi)存銷毀掉

谷歌瀏覽器(webkit),每隔一定時間查找對象有沒有被占用 引用計數(shù)器:當對象引用為0時釋放它

全局對象 GO 全局對象GO(Global Object)瀏覽器端會讓W(xué)INDOW指向GO

瀏覽器把內(nèi)置得一些屬性方法收到一個單獨得內(nèi)存中堆內(nèi)存(Heap)任何開辟得內(nèi)存都有一個16進制得內(nèi)存地址,方便后期找到這個內(nèi)存

執(zhí)行上下文 EC EC(Execution Context)執(zhí)行上下文:代碼自己執(zhí)行所在的環(huán)境

全局的執(zhí)行上下文EC(G) 函數(shù)中的代碼都會在一個單獨的私有的執(zhí)行上下文中處理 塊級的執(zhí)行上下文 形成的全局執(zhí)行上下文,進入到棧內(nèi)存中執(zhí)行“進棧” 執(zhí)行完代碼,可能會把形成的上下文出棧釋放“出棧”

變量對象 VO VO(Varibate Object)變量對象:在當前上下文中,用來存放創(chuàng)建的變量和值的地方(每一個執(zhí)行上下文中都有一個自己的變量對象,函數(shù)私有上下文中叫做AO(Activation Object)活動對象,但也是變量對象)

VO(G)全局變量對象:全局上下文中用來存儲全局變量的空間,它不是GO,只不過某些情況下VO(G)中的東西會和GO中的東西有所關(guān)聯(lián)而已“映射機制”

堆棧內(nèi)存釋放 JS中的內(nèi)存分為堆棧內(nèi)存和棧內(nèi)存

堆內(nèi)存:存儲引用數(shù)據(jù)類型值(對象:鍵值對, 函數(shù):代碼字符串) 棧內(nèi)存: 提供JS代碼執(zhí)行的環(huán)境和存儲基本類型值

堆內(nèi)存釋放: 讓所有引用堆內(nèi)存空間地址的變量賦值為null即可,沒有變量占用這個堆內(nèi)存了瀏覽器會在空閑的時候把他釋放掉

棧內(nèi)存釋放: 一般情況下,當函數(shù)執(zhí)行完成,所形成的私有作用域(棧內(nèi)存)都會自動釋放掉,在棧內(nèi)存中存儲的基本值也都會釋放掉,但也有特殊不銷毀的情況:

函數(shù)執(zhí)行完成,當前形成的棧內(nèi)存中,某些內(nèi)容被棧內(nèi)存以外的變量占用了,此時棧內(nèi)存不能釋放,一旦釋放外面找不到原有的內(nèi)容了

全局棧內(nèi)存只有在頁面關(guān)閉的時候才會被釋放掉

如果當前棧內(nèi)存沒有被釋放,那么之前在棧內(nèi)存中存儲的基本值也不會被釋放,能夠一直保存下來.

一般來說棧內(nèi)存是線性有序存儲,容量小,系統(tǒng)分配效率高。而堆內(nèi)存首先要在堆內(nèi)存新分配存儲區(qū)域,之后又要把指針(地址值)存儲到棧內(nèi)存中,效率相對就要低一些了。

垃圾回收方面,棧內(nèi)存變量基本上用完就回收了,而推內(nèi)存中的變量因為存在很多不確定的引用,只有當所有指向堆內(nèi)存的指針全部銷毀之后才會被垃圾回收。

數(shù)據(jù)類型創(chuàng)建步驟

基本數(shù)據(jù)類型

var a = 12;

創(chuàng)建一個值,創(chuàng)建一個變量,讓變量和值關(guān)聯(lián)在一起,基本數(shù)據(jù)類型值都是直接存儲到棧內(nèi)存中的

引用數(shù)據(jù)類型

var a = {n:12};

創(chuàng)建一個堆內(nèi)存,把鍵值對存儲到內(nèi)存中,堆內(nèi)存地址放到棧中,共變量調(diào)用

引用數(shù)據(jù)類型值都是先開辟一個堆內(nèi)存,把東西存儲進去,最后把地址放到棧中供變量關(guān)聯(lián)使用所有的指針賦值哦都是指針的關(guān)聯(lián)指向

到此這篇關(guān)于JS堆棧內(nèi)存的運行機制的文章就介紹到這了,更多相關(guān)js堆棧內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論