餐館中的服務員---垃圾回收

垃圾製造者的產生,推進了垃圾處理者的出現,因此在咱們如今的生活中,人們生產的垃圾都會經過相應的手段去處理掉,而不影響現代人的正常生活。程序來源於生活,因此程序世界也如同現代世界同樣,也要產生垃圾。固然,也須要垃圾回收員來處理生產出來的垃圾.javascript

垃圾

在程序世界中,再也不被任何變量使用的對像,或者說再也不被繼續使用的變量就是垃圾。java

function(){
  var a=0;//聲明變量並賦值
  a++;//對變量進行操做
  //下面都沒有對變量a進行操做,也就是沒有使用變量a,那變量a就變成了垃圾.
  var b=0;
  b++;
}

能夠把這個函數看成爲一個餐館,變量就至關於客人,坐在餐桌上吃飯的時候,就是在對變量進行操做,在佔用着那個餐桌。可是當客人吃完離開後,產生的垃圾仍是佔用了那個桌子。服務員若是不來收拾,就會一直佔用着那個桌子,一直佔用着那個內存,也就成了程序中的垃圾。小程序

垃圾回收

javascript中具備自動垃圾回收的機制,js的程序會找出那些再也不被繼續使用的變量,自動釋放再也不被任何變量使用的垃圾對象的內存空間。瀏覽器

function(){
  //局部變量在函數結束後,便會自動被收回內存
  var a=0;
  a++;
}

仍是餐館中,客人吃完飯後產生的垃圾,仍是佔用了那個桌子,表如今程序中,就還在佔用着那塊內存。那此時服務員清理垃圾以供接下來的顧客使用,即是垃圾回收。函數

垃圾的危害

內存中空間都是有限的,內存佔用越多,天然程序運行的越慢,當內存滿了的時候,程序就沒法運行,就像餐館,若是沒有服務員,每一個顧客用完餐滯留的垃圾沒法清理,那餐館可供顧客進餐的餐桌就會愈來愈少,等到餐桌都被垃圾佔滿,那這個餐館也就沒法營業了。設計

垃圾回收器

js引擎中,專門監控,並釋放垃圾的小程序。它有幾個特色code

  • 伴隨主程序在後臺並行執行對象

  • 會記錄每一個對象被幾個變量使用着ip

  • 只要發現一個對象再也不被任何變量使用,就釋放該對象所佔內存內存

這些特色也是和現實中餐館的服務員同樣

  • 服務員會在餐館營業時間一直工做(伴隨主程序),他不會打擾每位顧客的進餐(在後臺)。

  • 當有顧客進來餐館的時候,他會記錄顧客的桌位,而且記錄此桌位上顧客的個數

  • 只要發現餐桌上有垃圾而且沒有人在進餐了,他就會過去清理掉這些垃圾

策略

具體到瀏覽器中,垃圾回收有兩個策略,這兩個策略書上解釋的很詳細,網上解釋的也比較多,小白我就不在此詳細解釋了,簡單的說一下就好.

標記清除

當變量進入環境的時候就爲變量標記爲"進入環境",當變量離開環境的時候,會被標上"離開環境"。

垃圾收集器在運行的時候會給存儲在內存中的全部變量都加上標記。而後,它會去掉環境中的變量以及被環境中的變量引用的標記。而在此以後再被加上標記的變量將被視爲準備刪除的變量,緣由是環境中的變量已經沒法訪問到這些變量了。最後。垃圾收集器完成內存清除工做,銷燬那些帶標記的值,並回收他們所佔用的內存空間。

引用計數

另外一種不太常見的垃圾回收策略是引用計數。引用計數的含義是跟蹤記錄每一個值被引用的次數。當聲明瞭一個變量並將一個引用類型賦值給該變量時,則這個值的引用次數就是1。相反,若是包含對這個值引用的變量又取得了另一個值,則這個值的引用次數就減1。當這個引用次數變成0時,則說明沒有辦法再訪問這個值了,於是就能夠將其所佔的內存空間給收回來。這樣,垃圾收集器下次再運行時,它就會釋放那些引用次數爲0的值所佔的內存。

固然這個存在一些問題,這個就不過多說了。具體能夠翻閱《js高級程序設計(第三版)》的垃圾收集處。

建議

雖然js有主動垃圾回收的機制,可是程序仍是須要必定的判斷,並且是有時間間隔的。服務員不可能在你吃飯的時候一直盯着你問你,「你啥時候吃完啊,好了沒?」,因此仍是建議,只要一個變量再也不使用的時候,要主動爲其賦值爲null。 就至關於,在餐館吃飯,少點的垃圾,就本身收拾了唄。反正我通常都不收拾 (滑稽)

原文在博客裏面,有興趣的大佬能夠去支持一下小白的博客

相關文章
相關標籤/搜索