javascript 垃圾收集机制

609 阅读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 数组