javascript的垃圾回收机制
背景
JavaScript 是使用垃圾回收的语言,也就是说**执行环境**负责在代码执行时管理内存。在` C `和` C++`等 语言中,跟踪内存使用对开发者来说是个很大的负担,也是很多问题的来源。JavaScript 为开发者卸下 了这个负担,通过**自动内存管理**实现内存分配和闲置资源回收。
实现思路
基本思路很简单:确定哪个变量不会再 使用,然后释放它占用的内存。这个过程是周期性的,即垃圾回收程序每隔一定时间(或者说在代码执 行过程中某个预定的收集时间)就会自动运行。垃圾回收过程是一个近似且不完美的方案,因为某块内存是否还有用,属于“不可判定的”问题,意味着靠算法是解决不了的
垃圾回收程序必须跟踪记录哪个变量还会使用,以及哪个变量不会再使用,以便回收 内存。如何标记未使用的变量也许有不同的实现方式。不过,在浏览器的发展史上,用到过两种主要的标记策略:`标记清理`和`引用计数`。
实现方法
标记清除法(常用)
首先它会遍历堆内存上所有的对象,分别给它们打上标记,然后在代码执行过程结束之后,对所使用过的变量取消标记。在清除阶段再把具有标记的内存对象进行整体清除,从而释放内存空间。
- 垃圾收集器在运行时会给内存中的所有变量都加上一个标记
- 然后从各个根对象开始遍历,把还在被上下文变量引用的变量标记去掉标记
- 清理所有带有标记的变量,销毁并回收它们所占用的内存空间
- 最后垃圾回收程序做一次内存清理
引用计数法
引用计数是一种不常见的垃圾回收策略,思路是对每个值都记录其的引用次数,具体如下
- 当变量进行声明并赋值后,值的引用数为1
- 当同一个值被赋值给另一个变量时,引用书+1
- 当保存该值引用的变量被其它值覆盖时,引用数-1
- 当该值的引用数为0时,表示无法再访问该值了,此时就可以放心的将其清除并回收内存