javascript
JavaScript变量——栈内存or堆内存
原文??http://blog.csdn.net/xdd19910505/article/details/41900693
?
堆和棧這兩個字我們已經(jīng)接觸多很多次,那么具體是什么存在棧中什么存在堆中呢?就拿?JavaScript?中的變量來說:
?
首先?JavaScript?中的變量分為基本類型和引用類型。
?
基本類型就是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,而引用類型指的是那些保存在堆內(nèi)存中的對象。
?
?
?
1?、基本類型??
?
基本類型有?Undefined、Null、Boolean、Number 和String。這些類型在內(nèi)存中分別占有固定大小的空間,他們的值保存在棧空間,我們通過按值來訪問的。
?
?
?
2?、引用類型
?
引用類型,值大小不固定,棧內(nèi)存中存放地址指向堆內(nèi)存中的對象。是按引用訪問的。如下圖所示:棧內(nèi)存中存放的只是該對象的訪問地址,?在堆內(nèi)存中為這個值分配空間?。?由于這種值的大小不固定,因此不能把它們保存到棧內(nèi)存中。但內(nèi)存地址大小的固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存中。 這樣,當查詢引用類型的變量時, 先從棧中讀取內(nèi)存地址, 然后再通過地址找到堆中的值。對于這種,我們把它叫做按引用訪問。
?
?
其他語言中的內(nèi)存分配類似。
?
? ? ?PS:當我們看到一個變量類型是已知的,就分配在棧里面,比如INT,Double等。其他未知的類型,比如自定義的類型,因為系統(tǒng)不知道需要多大,所以程序自己申請,這樣就分配在堆里面。?
?
為什么會有棧內(nèi)存和堆內(nèi)存之分?
?
通常與垃圾回收機制有關。為了使程序運行時占用的內(nèi)存最小。
?
當一個方法執(zhí)行時,每個方法都會建立自己的內(nèi)存棧,在這個方法內(nèi)定義的變量將會逐個放入這塊棧內(nèi)存里,隨著方法的執(zhí)行結束,這個方法的內(nèi)存棧也將自然銷毀了。因此,所有在方法中定義的變量都是放在棧內(nèi)存中的;
?
當我們在程序中創(chuàng)建一個對象時,這個對象將被保存到運行時數(shù)據(jù)區(qū)中,以便反復利用(因為對象的創(chuàng)建成本通常較大),這個運行時數(shù)據(jù)區(qū)就是堆內(nèi)存。堆內(nèi)存中的對象不會隨方法的結束而銷毀,即使方法結束后,這個對象還可能被另一個引用變量所引用(方法的參數(shù)傳遞時很常見),則這個對象依然不會被銷毀,只有當一個對象沒有任何引用變量引用它時,系統(tǒng)的垃圾回收機制才會在核實的時候回收它。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wxiaona/p/4998219.html
總結
以上是生活随笔為你收集整理的JavaScript变量——栈内存or堆内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7 64位系统 memcache/
- 下一篇: 从前端角度来看网页设计