js引擎的垃圾回收是周期性的,每隔一定的时间就会自动执行一次,其基本思路很简单,就是确定哪个变量不会再被使用,然后释放它占用的内存
js引擎主要有两种垃圾回收的方法,分别为:
- 标记清除(最常用)
- 引用计数
标记清除
当变量离开执行上下文时,会被添加上离开上下文的标记,然后垃圾回收程序会销毁它。
垃圾回收程序运行的时候,会标记内存中存储的所有变量(记住,标记方法有很多种)。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存。
引用计数
其思路是对每个值都记录它被引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为1。如果同一个值又被赋给另一个变量,那么引用数加1。类似地,如果保存对该值引用的变量被其他值给覆盖了,那么引用数减1。当一个值的引用数为0时,就说明没办法再访问到这个值了,因此可以安全地收回其内存了。垃圾回收程序下次运行的时候就会释放引用数为0的值的内存。
(名词解释来自《JavaScript高级程序设计》)