JavaScript 內存模型

  • 1.內存的生命週期
  • 2.對象模型
  • 3.對象屬性的訪問優化

1.內存的生命週期

下面顯示了內存的生命週期,在內存分配階段js引擎將內存分爲棧、堆、池三種結構(嚴格來講池也屬於棧內存,這裏爲了直觀分開寫),還有一個程序運行時須要的內存;在內存使用階段引擎會將特定結構的數據作一些優化處理;在內存釋放回收階段經過特定的算法高效的進行內存釋放。 算法

1.1棧內存

棧是一種先進後出的數據結構,棧內存用於存放變量 ,程序運行時a,b依次進入棧空間,同時調用函數會造成一個調用棧 數組

1.2堆內存

因爲引用類型的值是可變的,因此存在堆中,棧中的變量存放着指向堆內存地址的指針 session

1.3池內存

池內存用於存放基本數據類型(爲固定值),棧中的變量存放着指向池內存地址的指針數據結構


2.對象模型

當定義一個對象時,以下圖所示,obj對象模型會將屬性值保存起來,屬性值對應的私有屬性,包含具體的值、是否可寫、是否可枚舉、是否可配置;而數組中,obj對象模型保存的是length屬性以及元素的索引,其中lenght屬性是不可枚舉以及不可配置,其餘的保持默認。函數

3.對象屬性的訪問優化

ps:各個引擎實現略有差別優化

3.1 具備相同結構的對象-shapes方法

按照上面說的,每建立一個對象就會建立相對應的obj模型,是否太浪費了?shapes方法就是就是爲了優化當具備相同結構 (具備相同的屬性值) 的對象建立時形成的內存浪費,它爲此新建了一個shape對象用於保存對象中相同的屬性,屬性保存着屬性值在原對象中的偏移量(offset)。根據對象的結構來優化對象的屬性獲取 指針

3.2 具備不相同結構的對象 -Transition鏈方法

當定義一個空對象,在往裏面新增屬性的時候。其中,每往裏面新增一個屬性就會產生一個shape對象,以此類推,便會造成一個Transition鏈,當須要訪問屬性的時候從下往上查找。cdn

3.3 具備不相同結構的對象 -Transition樹方法

當有多個空對象定義時,公用一個空shape對象,造成一個Transition樹 對象

結論:

1.始終以相同的⽅式初始化對象,以確保它們不會走向不同的shape方向
2.避免使⽤用稀疏數組blog

參考

1.blog.sessionstack.com
2.mathiasbynens.be/notes
3.v8.dev

溜了溜了。。。

相關文章
相關標籤/搜索