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)
    
  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/mininice/p/3875437.html
Copyright © 2011-2022 走看看