Javascript垃圾收集机制的介绍和理解
人们经常会使用Javascript来考虑垃圾收集机制,Javascript不是C,C++,开发人员需要手动删除垃圾,在Javascript程序的编写,开发人员不需要关心内存,内存分配和垃圾回收(废)是全自动的管理。主要原因是,程序收集,不再使用和释放的内存,他们占据的变量。因此,垃圾收集机制将执行此操作周期和周期按固定的时间间隔。例如,仅在内部函数存在局部变量,程序会堆存储空间对应一个局部变量在内存中或堆分配内存,当函数运行结束,由可变占领当地的记忆不再是必要的,然后程序会释放一个用于其他变量占领当地的记忆。这是释放内存最简单的方法,但很多时候,变量会在程序中使用。此时,垃圾回收机制必须跟踪变量并确定是否使用它,以及是否可以释放其内存空间。
在垃圾收集机制中,主要有两种判断内存空间的方法:一种是标记清除法,另一种是参考计数法。
标记方法,每个变量都有它的运行环境,它在创建之后会在一些环境中运行,比如创建一个局部变量,局部变量将在函数体中运行,当函数运行时,它会将局部变量标记为环境变量。当函数体运行时,它意味着变量超出了它的运行环境。在那个时候,变量被标记为离开环境。对于离开环境的变量,垃圾收集机制将在下一个恢复周期中被记录和释放。
引用计数法的每个值的引用数的轨道。当一个变量被声明和引用类型的值赋给变量,引用的数字是1。如果同一个值是给另一个变量的值的引用数加1。相反,如果包含一个参考这个值,得到另一个值的变量,参考数值1。当引用的数字是0,这说明没有办法再访问的价值,这样你就可以回收内存空间占用。当垃圾收集器运行在下一周期,它释放的参考零号的值所占用的内存空间。(原译参考:Javript高程序设计第二版)
例如,例如:
复制代码代码如下所示:
函数计算方法(){
VaR object1 =新的(对象); / /声明变量,计数器从0变为1
VaR object2 =新(对象); / /声明变量,计数器从0变为1
object1.method1 = object2; / /发生1计数器、object2计数器+ 1
object2.method2 = object1; / / object1 + 1计数器、object2反1
}
当这个函数是跑出来的,该发生的计数器的读数是1,和object2的计数器的数字是1。所以这两个变量都将被销毁。如果在功能上存在大量的此类项目,大量的内存将被浪费,不能回收利用,造成内存泄漏。
上述问题的解决方案是手动释放由object1 object2占用的内存:
复制代码代码如下所示:
object1.method1 = null;
object2.method2 = null;
比较上面的例子,并给出一个一般情况下的例子。
复制代码代码如下所示:
函数计算方法(){
VaR object1 =新的(对象); / /声明变量,计数器从0变为1
VaR object2 =新(对象); / /声明变量,计数器从0变为1
object1.method1 =这是Object1 ; / /发生反1,object1读数0
object2.method2 =这是object2 ; / / object2反1、object2读数0
}
通过本例,正常情况下,当函数运行结束后,发生阅读object2是0,在垃圾收集周期,将回收其内存释放。