这是我参与8月更文挑战的第十七天,活动详情查看:8月更文挑战
垃圾回收
JavaScript是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存。JavaScript通过自动内存管理实现内存分配和闲置资源回收,它的基本思路很简单:确定哪个变量不会再使用,然后释放这个变量所占用的内存。这个过程是周期性的,即垃圾回收程序每隔一段时间就会自动运行。
标记清理
当变量进入上下文,比如在函数内部声明一个变量时,这个变量会被加上存在于上下文中的标记。当变量离开上下文,也会被加上离开上下文的标记。垃圾回收程序运行时,会标记内存中存储的所有变量,然后它会将所有在上下文中的变量以及被在上下文中的变量引用的变量的标记去掉。也就是说,此时没有标记的变量是在用或者在被引用的。这时候垃圾回收程序会做一次内存清理,销毁带标记的所有值并收回它们的内存。
引用计数
引用计数的思路是对每个值都记录它被引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为1。如果同一个值有被赋给另一个变量,那么引用数加1。如果保存对该值引用的变量被其他值给覆盖了,那么引用数减1。当一个值的引用数为0时,就说明没办法再访问到这个值了,因此可以安全的进行内存回收了。垃圾回收程序下次运行时会释放引用数为0的值的内存。
内存管理
优化内存占用的最佳手段就是保证在执行代码时只保存必要的数据,如果数据不再必要,那么把它设置为null,从而释放其引用。这就叫接触引用。这个操作最适合全局变量和全局对象的属性。
内存泄漏
写的不好的JavaScript可能会出现难以察觉并且有害的内存泄露问题。可能造成内存泄漏的操作:
- 全局变量
- 闭包
- 没有清除DOM元素引用
- 遗忘的定时器或者回调
- console.log