JS垃圾回收
基本思路:确定那个变量不会再使用,然后释放其所占内存,这个过程是周期性的,即垃圾回收程序每隔一段时间(或者说在代码执行过程中某个预定的收集时间)就会自动运行
- 缺点:垃圾回收的过程中,因为某块内存是否还有用,不可判定
栗子:
函数中的局部变量会在函数执行时存在,此时,栈(或堆)内存会分配空间以保存相应的值
函数在内部使用了变量,然后退出,此时就不再需要哪个局部变量了,他占用的内容就会被释放,供后面变量使用
这种情况下显然不再需要局部变量了,但并不是所有的时候都会这么明显,这个局部变量不再需要使用
两种标记方法
垃圾回收程序必须跟踪记录那个变量还会使用,以及那个变量不需要再使用,以便回收内存.
1)标记清理 (常用)
当变量进入执行上下文时,就会被执行上下文的文本环境记录(此时,加上存在于执行上下文的标记),当变量离开执行上下文时也会被加上离开执行上下文的标记
标记的方法有很多
2)引用计数
思路:每个值都被记录他引用的次数,当这个值声明变量时并给他赋予一个引用值,如果同一个值又被赋予另一个变量时,引用值++,反之这个值引用的变量被其他值覆盖时,引用值--,当其引用值为 0 时 释放该值所占的内存 以供其他人使用(这个内存RAM => 运行内存)
var num = 1
// 内存中会有一个 1 的值 并且其 引用值 n = 1
var nums = 1
// 此时 内存 中的 1 的 引用值++ => n++ = 2
num = 2
// 此时 内存 中的 1 的 引用值-- => n-- = 1 而 2 的引用值 s = 1
nums = 2
// 此时 内存 中的 1 的 引用值-- => n-- = 0 而 2 的引用值 s++ = 1
// 故 此时 值:1 所占用的内存 将被释放
在NetScape 4.0 版本时 JavaScript就放弃了 引用计数 转而 使用 标记清理 因为函数中的Object 的 引用值 永远不会为 0 导致内存占用无法被释放 从而导致 性能降低