寫在前面:衆所周知,當咱們想學習某些知識或者解決某些技術難題的時候,網絡或者書籍上就會有一萬個大牛爲你解惑答疑。那麼我爲何還要關公面前舞大刀,花費大量的時間去寫這些文章呢?目的有兩個,第一是想經過寫寫技術文檔,來提高本身的表達總結能力;第二則是由於好記性不如爛筆頭的道理,短期內可能會以爲這是一個浪費時間浪費精力的事情,可是從長遠來看,這無疑會加深咱們對知識的理解並鞏固咱們的知識體系。git
棧內存由編譯器自動分配與釋放。咱們能夠直接操做棧內存中的值。js中的基本數據類都有固定的大小,被分配到棧內存中。這些基本類型的值都是按值引用。將一個基本類型的值賦值給另一個基本類型時,會爲這個新的值從新建立一個值並保存在棧內存中。github
堆內存是鏈表結構的類型,能夠動態分配大小,js引用類型佔用內存空間的大小不固定,存儲在堆內存中。因爲JS不容許直接訪問堆內存中的位置,所以咱們不能直接操做js的引用類型。而是生成一個指針,並將它放到棧內存中,經過這個指針來操做引用類型。算法
如今瀏覽器基本都在使用標記-清除的算法來執行垃圾回收。而不是使用引用計數的方式,由於引用計數方式沒法釋放循環引用結構的內存佔用。 標記清除算法的核型概念是:從根部(在JS中就是全局對象)出發定時掃描內存中的對象。凡是能從根部到達的對象,都是還須要使用的。那些沒法由根部出發觸及到的對象被標記爲再也不使用,稍後進行回收。瀏覽器
對於持續運行的服務進程(daemon),必須及時釋放再也不用到的內存。不然,內存佔用愈來愈高,輕則影響系統性能,重則致使進程崩潰。 對於再也不用到的內存,沒有及時釋放,就叫作內存泄漏(memory leak)網絡
參考:閉包