#垃圾回收 1.js是使用垃圾回收语言,也就是说执行环境在代码执行时负责管理内存。 2.js通过自动内存管理实现内存的分配,和闲置资源的回收, 3.思路:确定哪个变量不适用就释放它占有的内存,这个过程是周期性的每隔一段时间就会自动执行。 垃圾回收不可判定某块内存是否还有用,这个时候我们就需要跟踪记录那个变量还会使用,那个变量不再使用,在浏览器这一块常用的方法就是:标记清除,引用计数。 #标记清除 js最常用的的垃圾回收策略就是标记清除,当一个变量进入上下文时,这个变量就会被加上存在以上下文的标记,如果离开上下文就会被加上离开上下文的标记, 垃圾回收程序运行时会标记内存中所有存储的变量,然后他就会将在上下文中的变量以及被上下文引用的变量标记去除掉,此时被标记的就是待删除的。 #引用计数 思路就是记录每个值被引用的次数,比如:声明一个变量给它赋一个引用值,这个值的引用数就是1,如果同一个值被赋给另一个变量那它的引用值就加1,如果该引用值的变量被其他的值覆盖那它的引用数就减1 当引用值为0的时候就没法访问这个值了,就会被回收。 引用计数最早是在NetsCape Navigator 3.0 中采用。但是遇到了一个问题循环引用比如: `
function problem() {
let objA = new Object()
let objB = new Object()
objA.someObj = objB
objB.anyObj = objA
}
这个例子中就是对象objA有一个指针指向objB,objB也引用了objA,这两个相互引用意味着他们的引用数都是2,这就意味着他们两个永远不会被引用计数策略清除,如果多次调用就会导致大量内存不会被释放。造成内存泄漏。 为此,Netscape 在 4.0 版放弃了引用计数,转而采用标记清理。
`