zoukankan      html  css  js  c++  java
  • JS垃圾回收机制

    一、可达性

    简单地说,“可达性” 值就是那些以某种方式可访问或可用的值,它们被保证存储在内存中。

    1. 有一组基本的固有可达值,由于显而易见的原因无法删除。例如:

    • 本地函数的局部变量和参数
    • 当前嵌套调用链上的其他函数的变量和参数
    • 全局变量
    • 还有一些其他的,内部的

    这些值称为根。

    2. 如果引用或引用链可以从根访问任何其他值,则认为该值是可访问的。

    例如,如果局部变量中有对象,并且该对象具有引用另一个对象的属性,则该对象被视为可达性, 它引用的那些也是可以访问的,详细的例子如下。

    JavaScript 引擎中有一个后台进程称为垃圾回收器,它监视所有对象,并删除那些不可访问的对象。

    二、垃圾回收原理浅析

      现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。

    1、标记清除

      这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。
      垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。

    关于这一块,建议读读Tom大叔的几篇文章,关于作用域链的一些知识详解,读完差不多就知道了,哪些变量会被做标记。

    2、引用计数

      另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。

    三、引用删除

     family 对象:

    function marry (man, woman) {
      woman.husban = man;
      man.wife = woman;
    
      return {
        father: man,
        mother: woman
      }
    }
    
    let family = marry({
      name: "John"
    }, {
      name: "Ann"
    })

    函数 marry 通过给两个对象彼此提供引用来“联姻”它们,并返回一个包含两个对象的新对象。

    产生的内存结构:

    现在删除两个引用

    delete family.father;
    delete family.mother.husband;

    那么我们可以看到 John 不再有传入的引用:

    输出引用无关紧要。只有传入的对象才能使对象可访问,因此,John 现在是不可访问的,并将从内存中删除所有不可访问的数据。

    垃圾回收之后:

    基本的垃圾回收算法称为“标记-清除”,定期执行以下“垃圾回收”步骤:

    • 垃圾回收器获取根并“标记”(记住)它们。
    • 然后它访问并“标记”所有来自它们的引用。
    • 然后它访问标记的对象并标记它们的引用。所有被访问的对象都被记住,以便以后不再访问同一个对象两次。
    • 以此类推,直到有未访问的引用(可以从根访问)为止。
    • 除标记的对象外,所有对象都被删除。

    参考博客链接:

    https://segmentfault.com/a/1190000018605776?utm_source=tag-newest

    https://www.cnblogs.com/zhwl/p/4664604.html

  • 相关阅读:
    SSH 远程执行任务
    C# 创建压缩文件
    迁移 SQL Server 到 Azure SQL 实战
    在 Azure 上部署 Asp.NET Core Web App
    linux kill 命令
    VS 远程调试 Azure Web App
    Azure 基础:自定义 Table storage 查询条件
    NSOperation的使用细节 [2]
    NSOperation的使用细节 [1]
    [翻译] SSKeychain
  • 原文地址:https://www.cnblogs.com/fmyao/p/12530949.html
Copyright © 2011-2022 走看看