js内存管理
一 内存泄漏
程序的运行需要内存。 不再用到的内存,没有及时释放,就叫做内存泄漏。 有些语言(比如 C 语言)必须手动释放内存,程序员负责内存管理。 这很麻烦,所以大多数语言提供自动内存管理,减轻程序员负担,这被称为"垃圾回收机制"。
二 垃圾回收机制
垃圾回收机制最常使用的方法叫"引用计数":语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。
三 内存泄漏的识别方法
怎样可以观察到内存泄漏? 经验法则是,如果连续五次垃圾回收之后,内存占用一次比一次大,就有内存泄漏。这就要求实时查看内存占用。
通过Chrome 浏览器查看内存占用
- 打开开发者工具,选择 Performance 面板
- 在顶部的勾选 Memory
- 点击左上角的录制按钮。
- 在页面上进行各种操作,模拟用户的使用情况。
- 一段时间后,点击对话框的 stop 按钮,面板上就会显示这段时间的内存占用情况。
如果内存占用基本平稳,接近水平,就说明不存在内存泄漏。
反之,如果不断上升,就是内存泄漏。
四 ES6的WeakMap和WeakSet
及时清除引用非常重要。但开发者不可能记得那么多,有时一疏忽就忘了,所以才有那么多内存泄漏。
最好能在新建引用的时候就声明,哪些引用必须手动清除,哪些引用可以忽略不计,当其他引用消失以后,垃圾回收机制就可以释放内存。这样就能大大减轻程序员的负担,你只要清除主要引用就可以了。
ES6 考虑到了这一点,推出了两种新的数据结构:WeakSet 和 WeakMap。它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个"Weak",表示这是弱引用。