js 垃圾回收
js 的垃圾回收机制的基本思路很简单:确定那个变量不会使用了,然后自动内存管理实现内存分配和闲置资源回收,即垃圾回收程序每隔一定时间(或者说在代码执行过程中某个预定的收集时间)就会自动运行。垃圾回收过程是一个近似而不完美的方案,因为某块内存是否还有用,属于‘不可判定的’问题,意味着靠算法是解决不了的
在浏览器的发展中,用到两种主要的标记策略:标记清理和引用计数
标记清理
js 最常用的垃圾回收策略是标记清理,当变量进入上下文,比如在函数内部声明一个变量时,这个变量会被加上存在于上下文中的标记,而在上下文中的变量,逻辑上来讲,永远不应该释放他们的内存,因为只要上下文中的代码在运行,就有可能用到他们。当变量离开上下文时。也会被加上离开上下文的标记
给变量加标记的方式有很多种,比如,当变量进入到上下文时,反转某一位;或者可以维护‘在上下文中’和‘不在上下文中’两个变量列表,可以把变量从一个列表转移到另一个列表。标记过程的实现并不重要,关键是策略。
垃圾回收程序运行的时候,会标记内存中存储的所有变量,(记住标记的方式有很多种)。然而,它会将所有在上下文中的变量,以及被上下文中的变量引用的变量的标记去掉。在此之后,再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存
引用计数
另一种没那么常用的垃圾回收策略是引用技术。其思路是对每个值都记录它被引用的次数。声明变量并给他赋一个引用值时,这个值为1。如果同一个值又被赋值给另一个变量,那么引用数加1。类似的,如果保存在对该值引用的变量被其他覆盖掉了,那么引用数减1。当一个值得引用数为0的时候,就说明没有办法访问到这个值了,因此可以安全的收回其内存中。垃圾回收程序下次运行的时候就会释放引用数为0的值的内存