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

    垃圾回收器是一把十足的双刃剑。好处是简化程序的内存管理,内存管理无需程序员来操作,由此也减少了长时间运转的程序的内存泄漏。然而无法预期的停顿,影响了交互体验。本文从 V8 (node.js runtime) 的角度分析垃圾回收策略。

    暂时没弄懂v8的,有时间再研究

    下面的是js垃圾回收

         内存的生命周期:

    1. 分配你所需要的内存
    2. 使用分配到的内存(读、写)
    3. 不需要时将其释放归还

    所以,我们只要知道js引擎怎么判断内存变量不再需要,就知道js是在什么时候回收内存变量了。

    我们先来说一种古老的垃圾回收机制:

    引用计数垃圾收集

    这是最简单的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。

    我们看一段代码来分析:

     1 // 两个对象被创建,一个作为另一个的属性被引用,另一个被分配给变量o
     2 // 很显然,没有一个可以被垃圾收集
     3 var o = { 
     4   a: {
     5     b:2
     6   }
     7 }; 
     8 
     9 // o2变量是第二个对“这个对象”的引用
    10 var o2 = o; 
    11 
    12 // 现在,“这个对象”的原始引用o被o2替换了
    13 o = 1;      
    14 
    15 // 引用“这个对象”的a属性
    16 // 现在,“这个对象”有两个引用了,一个是o2,一个是oa
    17 var oa = o2.a; 
    18 
    19 // 最初的对象现在已经是零引用了
    20 // 他可以被垃圾回收了
    21 // 然而它的属性a的对象还在被oa引用,所以还不能回收
    22 o2 = "yo"; 
    23 oa = null; 
    24 // a属性的那个对象现在也是零引用了
    25 // 它可以被垃圾回收了

    引用计数垃圾收集有一个很大的缺陷:无法处理循环引用

    但是无法处理下列代码:

    function f(){
      var o = {};
      var o2 = {};
    
      // o 引用 o2
      o.a = o2; 
    
      // o2 引用 o
      o2.a = o; 
    }
    
    f();

    标记-清除垃圾收集

    这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。

    这个算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。定期的,垃圾回收器将从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和所有不能获得的对象。

  • 相关阅读:
    VMware Workstation虚拟机Ubuntu中实现与主机共享(复制和粘贴)
    虚拟机 VMware Workstation12 安装Ubuntu系统
    虚拟机 VMware Workstation12 安装OS X 系统
    ASP.NET Core学习链接
    Java开发中的23种设计模式详解
    C#线程同步的几种方法
    FTP webReq.ContentType异常的处理
    大小端 Big-Endian 与 Little-Endian
    C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用
    C++:成员运算符重载函数和友元运算符重载函数的比较
  • 原文地址:https://www.cnblogs.com/yu-hailong/p/8426985.html
Copyright © 2011-2022 走看看