javascript 垃圾收集机制

559 阅读3分钟

javascript 垃圾收集机制

  1. 什么是垃圾收集?
  2. 垃圾收集的方式有哪些(俗称捡垃圾)?
  3. 什么是内存泄漏?

1、什么是垃圾收集?

随着业务需求的增加,代码运行时占用的内存越来越大,但是内存是有限的,对于代码执行完后的变量、对象我们是不是要自己手动去清理删除呢?

其实并不需要,Javascript 具有自动垃圾回收机制,会定期对那些我们不再使用的变量、对象所占用的内存进行释放

收集这些不再使用的变量、对象,给这些变量和对象进行标记,后期回收其占用的内存的过程就是垃圾收集。

简而言之:其实并不需要,Javascript 具有自动垃圾回收机制,会定期对那些我们不再使用的变量、对象所占用的内存进行释放。垃圾收集器会按照固定的时间间隔周期性的执行。

Javascript 中存在两种变量

  • 全局变量
  • 声明周期会一直持续,直到页面卸载
  • 局部变量
  • 局部变量声明在函数中,它的声明周期从执行函数开始,直到函数执行结束。
  • 在这个过程中,局部变量会在堆或栈上被分配相应的空间以存储它们的值,函数执行结束,这些局部变量也不再被使用,它们所占用的空间也就被释放
  • 有一种情况的局部变量不会随着函数的结束而被回收,那就是局部变量被函数外部的变量所使用,其中一种情况就是闭包,因为在函数执行结束后,函数外部的变量依然指向函数内的局部变量,此时的局部变量依然在被使用,所以也就不能够被回收

2、捡垃圾的常规方式

  1. 标记清除
  2. 当变量进入执行环境时标记为“进入环境”,当变量离开执行环境时则标记为“离开环境”,被标记为“进入环境”的变量是不能被回收的,因为它们正在被使用,而标记为“离开环境”的变量则可以被回收
  3. 引用计数
  4. 跟踪记录每个值被引用的次数,当引用次数为0时,说明没有访问这个值了,这时会进行将其占用的内存回收。
  5. 引用计数的方式,有一个相对明显的缺点——循环引用
  6. 容易内存泄露
  7. 其它回收算法参考

3、什么是内存泄漏?

本质上讲, 内存泄露就是不再被需要的内存, 由于某种原因**, 无法被释放**.

为什么要管理内存?

  • 防止网页耗尽全部系统内存导致系统崩溃
  • 而内存限制。不仅会影响给变量分配内存,还会影响调用栈以及在一个线程中能够同时执行的语句数量。

确保占用最少的内存,让页面获得更好的性能。优化内存占用是最佳的方式。

一般通过将不再使用的数据的值设置为null 来释放其引用。这个做法就是解除引用。适用用大多数的全局变量和全局对象的属性局部变量会在它们离开执行环境自动被解除引用

常见内存泄漏案例:

  • 全局变量照成内存泄露
  • 未销毁的定时器和回调函数照成内存泄露
  • 闭包照成内存泄露
  • DOM 引用照成内存泄露

本文使用 mdnice 排版

文章列表

JavaScript 基本概念

JavaScript 数据类型

JavaScript 基本类型和引用类型

javascript 执行环境和作用域

javascript 垃圾收集机制

javascript 数组