zoukankan      html  css  js  c++  java
  • 浏览器的垃圾回收机制

    垃圾回收机制

    垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存,内存泄露和浏览器实现的垃圾回收机制息息相关, 而浏览器实现标识无用变量的策略主要有下两个方法:

    引用计数

    跟踪记录每个值被引用的次数。当声明一个变量并将引用类型的值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次 数加1.相反,如果包含对这个值引用的变量又取得另外一个值,则这个值的引用次数减1.当这个值的引用次数变成0时,则说明没有办法访问这个值了,因此就 可以将其占用的内存空间回收回来。

    如: var a = {};     对象{}的引用计数为1
            b = a;          对象{}的引用计数为 1+1
            a = null;       对象{}的引用计数为2-1
    
    

    所以这时对象{}不会被回收;

    IE 6, 7 对DOM对象进行引用计数回收, 这样简单的垃圾回收机制,非常容易出现循环引用问题导致内存不能被回收, 进行导致内存泄露等问题, 如:

    demo1:
    var btn = $("button");
    btn.onclick = function(){
       //当这里也可以访问到btn,说明function内部存在btn的引用
    };
    
    demo2:
    
    function a () {
        var x = { };
        var y = {};
        x.a = y;
        y.a = x;
    }
    a();
    
    函数a执行完后,本来x, y对象都应该在垃圾回收阶段被回收, 可是由于存在循环引用,也不能被回收。
        
    

    标记清除(mark-and-sweep)

    到2008年为止,IE,Firefox,Opera,Chrome和Safari的javascript实现使用的都是标记清除式的垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。

    标记清除的算法分为两个阶段,标记(mark)和清除(sweep). 第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除

    markFromRoots():
        worklist <- empty
        for each fld in Roots
            ref <- *fld
            if ref != null && isNotMarked(ref)  
               setMarked(ref)
               add(worklist,ref)
               mark()
    mark():
        while not isEmpty(worklist)
              ref <- remove(worklist)  
              for each fld in Pointers(ref)  
                    child <- *fld
                    if child != null && isNotMarked(child)
                       setMarked(child)
                       add(worklist,child)
    
    sweep(start,end):
        scan <- start
       while scan < end
           if isMarked(scan)
              setUnMarked(scan)
          else
              free(scan)
          scan <- nextObject(scan)
    
    atomic collect():
        markFromRoots()
        sweep(HeapStart,HeapEnd)
    
  • 相关阅读:
    『Argparse』命令行解析
    『MXNet』专题汇总
    用.NET开发通用Windows App
    ASP.NET 5探险(6):升级ASP.NET 5到beta6
    使用ASP.NET MVC、Rabbit WeixinSDK和Azure快速开发部署微信后台
    Visual Studio 2015将在7月20号RTM
    VS2015上又一必备免费插件:Refactoring Essentials
    ASP.NET 5探险(5):利用AzureAD实现单点登录
    Visual Studio Code升级到0.5,提供对ES6的更好支持
    ASP.NET 5探险(4):如何把ASP.NET 5从beta4升级到beta5
  • 原文地址:https://www.cnblogs.com/mininice/p/3875437.html
Copyright © 2011-2022 走看看