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

    通过链接过来的朋友知道闭包存在内存不清除问题,也就是局部变量本来要自动清除的,现在不清除了,那么这个清除是怎么个清除法?

    手动清除法:适用于闭包不用了的情况下

    function outer() {
            var a = 1;
          return function inner() {
                a = a + 1;
                console.log(a)
            }
        }
        // fn和inner函数连在一起,不能自动清理a
        var fn = outer();
       //  不用闭包了,跟inner断开联系
        fn = null

    标记-清除法(浏览器默认,有内存储存不连续缺点):说的简单点,不同浏览器都是固定时间清理一次,清理那些不再需要的变量,只不过不同浏览器的时间不同而已,都说了是标记-清除,首先要标记。【CG算法】(共轭梯度)(迭代)

    标记:从windows全局对象开始往下找,找到了做个标记,做什么标记不重要(红宝书),没找到的也就是没标记的都要清除。也就是为什么把outer()给全局fn就不用清除a了呢,因为赋值给fn,windows下找到了fn,fn又找到了a所以清除不了。

    清除:垃圾清理器清理就好

    引用计数法(循环引用无法清除):记录引用次数,0次就可以清除了,循环引用是致命的,所以浏览器都抛弃了引用计数法

    var obj1 = {
            fn: function(a) {
              console.log(a);
            }
          };
          var obj2 = {
            fn: function(b){
                console.log(b);  
            }
          };
          // obj1引用了obj2,obj2引用了obj1,引用计数法无法清除
          obj1.fn(obj2)
          obj2.fn(obj1)

    最后说一下内存泄露(以后没用又清除不了)的几种常见情况:全局变量(无法被回收机制清除,不知道以后会不会还会用)闭包(感觉本质上还是全局变量不能回收引起的)(DOM清除下)事件未清理

  • 相关阅读:
    求两个字符串中相同的汉字及字母的个数
    将十进制转成十六进制
    综合模糊查询
    求第一个字符串中第二个串的个数
    去除字符串中连续的分割符
    去除字符串中的html标记及标记中的内容
    sql基础语句
    SQL Server2008函数大全(完整版)
    sql 数字转人民币大写函数(两种方法)
    数字转IP地址函数
  • 原文地址:https://www.cnblogs.com/wchjdnh/p/10800240.html
Copyright © 2011-2022 走看看