js 的两种回收机制
标记清除(mark and sweep)
从语义上理解就比较好理解了,大概就是当变量进入到某个环境中的时候就把这个变量标记一下,比如标记为“进入环境”,当离开的时候就把这个变量的标记给清除掉,比如是“离开环境”。而在这后面还有标记的变量将被视为准备删除的变量。
- 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(可以使用任何标记方式)。
- 然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。
- 而在此之后再被加上的标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
- 最后,垃圾收集器完成内存清除工作。销毁那些带标记的值并回收它们所占用的内存空间。
这是 javascript 最常见的垃圾回收方式。至于上面有说道的标记,到底该如何标记 ? 好像是有很多方法,比如特殊位翻转,维护一个列表什么的。
引用计数(reference counting)
- 引用计数的含义是跟踪记录每个值被引用的次数,当声明一个变量并将一个引用类型的值赋给该变量时,这个时候的引用类型的值就会是引用次数 +1 了。如果同一个值又被赋给另外一个变量,则该值的引用次数又 +1。
- 相反如果包含这个值的引用的变量又取得另外一个值,即被重新赋了值,那么这个值的引用就 -1 。当这个值的引用次数编程 0 时,表示没有用到这个值,这个值也无法访问,因此环境就会收回这个值所占用的内存空间回收。
- 这样,当垃圾收集器下次再运行时,它就会释放引用次数为 0 的值所占用的内存。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »