标记-清除算法是最基础的垃圾回收算法,它需要配合标记-整理算法
标记-清除分为两个过程,标记和清除
标记过程
标记使用遍历的方式,比如一个从一个function开始,function所有引用的变量,对象,以及function中的function,都会被遍历,类似一个油漆桶,从根节点出发,所有引用的节点都会被染色,而将未被染色(未被引用的节点标记)
js 没有弱引用的说法,只有weakSet和weakMap是弱引用的,在遍历标记的时候,会将强引用中未抵达的节点和弱引用的节点标记。
抄来的:
首先是标记过程阶段。标记阶段就是从一组根元素开始,递归遍历这组根元素,在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据。
那么这种标记-清除后,会有一些问题,我们知道堆的内存是链式的,这就造成在清除后很多内存的空间都是不连续的,再需要比较大的空间的时候,还是空间不够,然后就会再次进行标记清除,以此循环。
那么这个时候,如果再标记清除后,来整理一下这些空间,将已有的内存紧凑存放,就可以了,所以就有了标记-整理