垃圾回收机制是指程序在运行过程中,通过自动识别无用的内存并释放其占用的空间,以达到优化内存管理的目的。JS的垃圾回收机制和其他编程语言的垃圾回收机制有一定的区别。
垃圾回收机制分为两类:标记清除和引用计数。
标记清除,意思是在内存中标记那些变量不再需要使用,并且在垃圾回收器运行时回收那些被标记的变量所占用的内存空间。具体地说,垃圾回收器会从根节点开始遍历所有能访问的对象,把能找到的对象标记为“活”的,其余为“不活”的,然后将那些标记为“不活”的对象内存清空并回收,以释放其占用的内存空间,从而达到优化内存管理的目的。
引用计数,则是将内存空间限制为一定数量,并通过维护计数器来追踪每个值被引用的次数。一旦一个值的引用计数变量为0,则说明其不再被使用,内存空间也就可以被回收。引用计数法的主要问题在于无法处理循环引用,这会导致内存泄漏。
循环引用 指的是两个或多个对象之间相互引用的情况。在这种情况下,即使对象已经不再被程序其他部分引用,它们在彼此之间的引用仍然存在,导致其引用计数不为 0,无法被回收。 例如,一个对象A引用了一个对象B,而对象B又引用了对象A,这就形成了一个循环引用。在引用计数法中,当对象A和B都不再被其他部分引用时,它们的引用计数都不为 0,导致无法进行回收,从而造成内存泄漏。 ps: 标记清除法不存在循环引用的问题