「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
定义
JS垃圾回收机制的目的是为了防止内存泄漏,为了回收这些不被需要的变量,并且释放掉他们所指向的内存
扩展
内存泄漏是指有一些已经不被需要的变量但仍然存在在内存中,既不能使用也不能清清除
为什么需要垃圾回收
由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃
垃圾回收的方式
标记清除
在 JS 中,最常用的垃圾收集方法就是标记清除。当变量进入环境时,就将这个变量标记为 "进入环境"。从逻辑上讲,永远不能释放那些进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能用到他们。而当变量离开环境时,则将其标记为 "离开环境"
垃圾回收机制在运行的时候会给存储再内存中的所有变量都加上标记(可以是任何标记方式),然后,它会去掉处在环境中的变量及被环境中的变量引用的变量标记(闭包)。而在此之后剩下的带有标记的变量被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾回收机制到下一个周期运行时,将释放这些变量的内存,回收它们所占用的空间。
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。
引用计数
引用计数是一张不太常见的垃圾收集策略。引用计数的含义是跟踪记录每个值被引用的次数。
当生命了一个变量将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。
当某个值的引用次数变成0时,则说明没有办法再访问这个值,而且这个值也没有存在的意义了,所以它会被释放。