JavaScript学习笔记(十)垃圾回收
- JavaScript 是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存;
- 通过自动内存管理实现内存分配和闲置资源回收;
- 基本思路:确定哪个变量不会再使用,然后释放它占用的内存
- 这个过程是周期性的,即垃圾回收程序每隔一定时间,就会自动运行
- 两种主要的标记策略:标记清理和引用计数
标记清理
定义
当变量进入上下文,比如在函数内部声明一个变量时,这个变量会被加上存在于上下文中的标记;当变量离开上下文时,也会被加上离开上下文的标记。
标记方式
- 当变量进入上下文时,反转某一位
- 维护“在上下文中”和“不在上下文中”两个变量列表,可以把变量从一个列表转移到另一个列表
引用计数
设计思路
- 对每个值都记录它被引用的次数;
- 声明变量并给它赋一个引用值时,这个值的引用数为 1;
- 如果同一个值又被赋给另一个变量,那么引用数加 1;
- 如果保存对该值引用的变量被其他值给覆盖了,那么引用数减 1;
- 当一个值的引用数为 0 时,就说明没办法再访问到这个值了,因此可以安全地收回其内存了。
性能
- 垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的时间调度很重要;
- 无论什么时候开始收集垃圾,都能让它尽快结束工作;
- 现代垃圾回收程序会基于对 JavaScript 运行时环境的探测来决定何时运行;
- 在 IE 中,window.CollectGarbage()方法会立即触发垃圾回收
- 在Opera 7 及更高版本中,调用 window.opera.collect()也会启动垃圾回收程序
内存管理
- 将内存占用量保持在一个较小的值可以让页面性能更好;
- 优化内存占用的最佳手段就是保证在执行代码时只保存必要的数据;
- 解除引用:如果数据不再必要,那么把它设置为 null,从而释放其引用;
通过const和let声明提升性能
let和const是块级作用域,所以相比于使用 var,使用这两个新关键字可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存
隐藏类和删除操作
内存泄漏
静态分配与对象池
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 姚永坤的小窝!
评论