细说JS系列(十)

79 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

铃铛说点题外话

上一篇我们根据案例说了内存管理,说了JS垃圾回收的两种方式:标记清除和引用计数,这一篇就详细的说说JS的垃圾回收机制。

铃铛说正文

我们先来说说为什么需要垃圾回收? 因为内存的大小是有限的,所以当我们不再需要这个变量的时候,我们需要对其进行释放,以便腾出更多的内存空间给新增变量使用。

垃圾回收分为:手动和自动

  • 在手动理内存的语言中,我们需要通过一些方式自己来释放不再需要的内存,比如 free 函数:

    • 但是这种管理的方式其实非常的低效,影响我们编写逻辑的代码的效率。
    • 并且这种方式对开发者的要求也很高,并且一不小心就会产生内存泄露。
  • 所以大部分现代的编程语言都是有自己的垃圾回收机制:

    • 垃圾回收的英文是 Garbage Collection ,简称 GC ;
    • 对于那些不再使用的对象,我们都称之为是垃圾,它需要被回收,以释放更多的内存空间;
    • 而我们的语言运行环境,比如 Java 的运行环境 JVM( Java 虚拟机) ,JavaScrip 的运行环境 js 引擎都有内存垃圾回收器
    • 垃圾回收器我们也会简称为 GC ,所以在很多地方你看到 GC 其实指的是垃圾回收器。
  • GC 怎么知道哪些对象是不再使用的呢?

    • 这里就用到了GC算法
  • GC垃圾回收机制有两种常用的策略

    • 常用的标记清除
    • 不常用的引用计数

那么我们就详细的说说这两种方式是怎么实现的?

最常用的JS垃圾回收机制就是标记清除

标记变量的方法有很多种,其实核心就是给变量标记上我们可以识别的标记。

  1. 比如在函数内部声明一个变量时,这个变量会被加上存在于上下文的标记。当变量离开上下文的时候,也会被加上离开的标记。
  2. 再比如,当变量进入上下文的时候反转某一位,或者可以维护“在上下文中”和“不在上下文”中两个变量列表,可以把变量从一个列表转移到另一个列表。标记过程的实现并不重要,重要的是策略。

另一个不常用的垃圾回收策略是引用计数:引用计数的思路就是对每个值都记录它被引用的次数。

声明变量并给它赋一个引用值时,这个值的引用数为 1 。如果同一个值又被赋给另一个变量,那么引用数 +1 。如果保存对该值引用的变量被其他值覆盖了,那么引用数 -1

当一个值的引用数为 0 时,就说明没有办法在访问到这个值了,就可以安全的回收内存了。垃圾回收程序下次运行的时候就会释放引用数为 0 的值的内存。

跟铃铛说再见

关于垃圾回收今天就说到这里了,我们只需要知道大概的就可以了。下一篇再见!!!