垃圾製造者的產生,推進了垃圾處理者的出現,因此在咱們如今的生活中,人們生產的垃圾都會經過相應的手段去處理掉,而不影響現代人的正常生活。程序來源於生活,因此程序世界也如同現代世界同樣,也要產生垃圾。固然,也須要垃圾回收員來處理生產出來的垃圾.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。 就至關於,在餐館吃飯,少點的垃圾,就本身收拾了唄。反正我通常都不收拾 (滑稽)
原文在博客裏面,有興趣的大佬能夠去支持一下小白的博客