JavaScript内存管理

内存堆,存储变量、常量或者对象的区域。

标记与清除算法,从内存堆中安全清除不可获得的对象。垃圾回收器周期性地从根部或全局对象开始,移向被它们引用的对象,接着再移向被这些对象引用的对象。所有不可获得的对象会在之后被清除。

内存泄漏,程序之前需要用到的部分内存,在使用完后并没有返回到内存池。

导致内存泄漏的常见错误:

  1. 全局变量,深层嵌套对象,将会浪费大量内存。访问一个没有提前声明过的变量,将在全局作用域中创建一个变量。
  2. 事件监听器,单页面应用中转向其他页面,又忘记移除这些监听器,也会导致内存泄漏。在这些页面中来回移动,这些监听器会不断增加。
  3. setTimeoutsetInterval,当在这些闭包中引用对象时,需要手动清除对象。
  4. 移除DOM元素
  5. 调用栈,遵循先进后出规则的数据结构,用于存储和获取数据,JavaScript引擎通过栈来记住一个函数中最后执行的语句所在位置。
  6. 栈溢出,在不对栈执行弹出的情况下,可连续压栈的数目取决于栈的大小,如果超过这个界限依然不断压栈,最终导致栈溢出。
  7. 递归