JS棧內存與堆內存


㈠JavaScript變量

⒈分類

⑴JavaScript中的變量分為基本類型和引用類型。

⑵基本類型就是保存在棧內存中的簡單數據段。

⑶引用類型指的是那些保存在堆內存中的對象。

 

⒉基本類型

 基本類型有Undefined、Null、Boolean、Number 和String。

 這些類型在內存中分別占有固定大小的空間,它們的值保存在棧空間,我們通過按值來訪問的。   

 

⒊引用類型

⑴引用類型,值大小不固定,棧內存中存放地址指向堆內存中的對象。因此是按引用訪問的

⑵棧內存中存放的只是該對象的訪問地址,在堆內存中為這個值分配空間。

⑶由於這種值的大小不固定,因此不能把它們保存到棧內存中。

⑷但內存地址大小的固定的,因此可以將內存地址保存在棧內存中。

⑸這樣,當查詢引用類型的變量時, 先從棧中讀取內存地址, 然后再通過地址找到堆中的值。對於這種,我們把它叫做按引用訪問

⑸當我們看到一個變量類型是已知的,就分配在棧里面,比如INT,Double等。

⑹其他未知的類型,比如自定義的類型,因為系統不知道需要多大,所以程序自己申請,這樣就分配在堆里面。

⑺基本類型大小固定,引用類型大小不固定,分開存放使得程序運行占用內存最小。

 

㈡棧內存

⒈什么是棧內存?

棧內存:引擎執行代碼時工作的內存空間,除了引擎,也用來保存基本值和引用類型值的地址。

 

⒉棧內存的簡單介紹

⑴棧內存中的變量一般都是已知大小或者有范圍上限的,算作一種簡單存儲。

⑵棧內存:存放基本類型。

⑶基本類型在當前執行環境結束時銷毀。

 

㈢堆內存

⒈什么是堆內存?

堆內存:用來保存一組無序且唯一的引用類型值,可以使用棧中的鍵名來取得。

 

⒉堆內存的簡單介紹

⑴堆內存存儲的對象類型數據對於大小這方面,一般都是未知的。

⑵因此當我們定義一個const對象的時候,我們說的常量其實是指針,就是const對象對應的堆內存指向是不變的,但是堆內存中的數據本身的大小或者屬性是可變的。而對於const定義的基礎變量而言,這個值就相當於const對象的指針,是不可變。

⑶ 堆內存:存放引用類型(在棧內存中存一個基本類型值保存對象在堆內存中的地址,用於引用這個對象。)

⑷引用類型不會隨執行環境結束而銷毀,只有當所有引用它的變量不存在時這個對象才被垃圾回收機制回收。

 

㈣JS中的堆內存與棧內存

⑴在js引擎中對變量的存儲主要有兩種位置,堆內存和棧內存。

⑵棧內存主要用於存儲各種基本類型的變量;而堆內存主要負責像對象Object這種變量類型的存儲。

⑶具體如下圖:

 

㈤棧內存和堆內存的區別

1.定義不同

堆內存是區別於棧區、全局數據區和代碼區的另一個內存區域。堆允許程序在運行時動態地申請某個大小的內存空間。棧內存在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。

 

2.特點不同

堆內存實際上指的就是優先隊列的一種數據結構,第1個元素有最高的優先權;棧內存實際上就是滿足先進后出的性質的數學或數據結構。棧內存是存取速度比堆要快,僅次於寄存器,棧數據可以共享。

 

3.范圍不同

堆內存中分配的內存需要程序員手動釋放,如果不釋放,而系統內存管理器又不自動回收這些堆內存的話動態分配堆內存,那就一直被占用。棧內存中為這個變量分配內存空間,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。

 

參考:https://www.jianshu.com/p/4d8a952d3786


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM