JS环境中分配的内存,一般有如下生命周期:
1. 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存
2. 内存使用:即读写内存,也就是使用变量、函数等
3. 内存回收: 使用完毕,由垃圾回收器自动回收不再使用的内存
说明:
- 全局变量一般不会回收(关闭页面回收)
- 一般情况下局部变量的值,不用了,会被自动回收掉
内存泄漏:程序中分配的内存由于某种原因程序未释放或无法释放叫做内存泄漏
下面介绍两种常见的浏览器垃圾回收算法:
[引用计数法]
引用计数
IE采用的引用计数算法,定义“内存不再使用”,就是看一个对象是否有指向它的引用,没有引用了就回收对象
算法:
跟踪记录被引用的次数
如果被引用了一次,那么就记录次数1,多次引用会累加
如果减少一个引用就减1
如果引用次数是0,则释放内存
经典错误:
但它却存在一个致命的问题,嵌套引用 (循环引用)如果两个对象相互引用,尽管他们已不再使用,垃圾回收器也不会进行回收,导致内存泄露。
[标记清除法]
标记清除算法将不再使用的对象定义为无法达到的对象。
凡是不能从根部到达的对象,都是不需要使用的,垃圾回收机制就把他们的内存释放。