内存的介绍
- 内存的生命周期: 申请内存 –> 使用内存 –> 释放内存
什么是内存泄露
- 内存泄露就是不在被应用需要的内存,由于某种原因,没有归还给操作系统。
垃圾回收算法
引用计数法:
- 如果该对象没有引用就被回收。
- 缺点就是在循环引用情况下无法回收。
1
2
3
4
5
6function test(){
var obj1 = {};
var obj2 = {};
obj1.x = obj2 ; // obj1引用obj2
obj2.x = obj1 ; // obj2引用obj1
}
标记清除法
- 创建垃圾回收器对象, 浏览器宿主对象window, 检测它所有的子对象是否存在。
- 所有子对象递归检测,如果从window开始能到达标记为激活,就不视为垃圾
- 所有子对象递归检测,如果从window开始不能到达就视为垃圾,归还给操作系统
内存泄露的场景
全局变量
1 | //案例 |
被遗忘的定时器和回调函数
1 | //案例 |
DOM外引用
1 | //案例 |
闭包
1 | //闭包本身不会造成内存泄露,使用不当才会导致 |
内存泄露检测
浏览器
- chrome开发者工具memory
- 点击take snapshot进行对比
node环境
- process.memoryUsage方法