餐馆中的服务员---垃圾回收

垃圾制造者的产生,推进了垃圾处理者的出现,因此在咱们如今的生活中,人们生产的垃圾都会经过相应的手段去处理掉,而不影响现代人的正常生活。程序来源于生活,因此程序世界也如同现代世界同样,也要产生垃圾。固然,也须要垃圾回收员来处理生产出来的垃圾.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。 就至关于,在餐馆吃饭,少点的垃圾,就本身收拾了呗。反正我通常都不收拾 (滑稽)

原文在博客里面,有兴趣的大佬能够去支持一下小白的博客

相关文章
相关标签/搜索