垃圾回收

垃圾回收机制

GC(Garbage Collection,垃圾回收)是一种内存自动管理机制, 垃圾回收器(Garbage Collector)可以自动回收分配给程序的已经不再使用的内存。
如果没有垃圾回收机制,及时清理不被引用的值,并释放相应的内存空间,将会消耗完系统中所有可用内存,造成系统崩溃。

垃圾回收机制的思路

清理掉内存中不再被引用的值,按照固定时间周期性的执行回收。
就是清理掉内存中没用的值,那么如何判断有没有用?
如果是局部变量,在函数调用结束后即是无用的,可以被回收掉;
全局变量在浏览器卸载页面的时候才会消失。

GC算法

标记清除 (Mark Sweep)

优点是能够回收循环引用的对象。

  1. 给所有变量增加一个标记,如果是进入执行环境(比如声明变量),则标记为“进入环境”,如果是结束执行环境(比如执行完相关函数),则标记为“离开环境”;

  2. 去掉“进入环境”的变量标记以及被该变量所引用的变量标记(比如闭包);

  3. 还存在标记的变量即是需要被清理的变量。

标记整理(Mark Compact)

缺点是:移动对象位置,不会立即回收对象,回收的效率比较慢。
标记阶段的操作和Mark-Sweep一致。
清除阶段会先执行整理,移动对象位置,将存活的对象移动到一边,然后再清理边界外的内存。

引用计数(Reference Counting)

将资源(比如对象)的被引用次数保存起来,如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。
该方法的局限性:当出现循环引用时,互相引用的对象不会被回收。

内存泄漏

内存泄漏是指,应当被回收的对象没有被正常回收,导致内存占用越来越高。
内存泄漏会导致应用程序速度变慢、延时高、崩溃等问题。

内存泄露常见原因

  1. 创建全局变量,且没有手动回收。
  2. 事件监听器 / 定时器 / 闭包等未正常清理。
  3. 使用 JavaScript 对象来做缓存,且不设置过期策略和对象大小控制。
查看评论