• Javascript高级程序设计——垃圾收集


      javascipt具有自动垃圾回收机制

      局部变量只在函数执行过程中存在,在这个过程中,会为局部变量在栈上(或堆)内存分配相应空间,来储存他们的值,当函数执行完,局部变量就没有存在的必要了,所以这个时候可以释放他们的内存。而垃圾收集器必须跟踪那个变量有用,那个变量没用,对不用的变量打上标记,以便回收。

      

    标记清除:

      当变量进入环境时,就将这个变量标记为”进入环境“,当离开环境时标记为”离开环境”等待内存回收。

      

    引用计数:

      引用计数就是跟踪记录每个值被引用的次数,当声明一个变量,并将一个应用类型值赋值给该变量, 则这个值的引用次数就是1,如果同一个值又被引用给另外一个变量,则这个值的引用次数加一,如果包含这个值引用的变量又取另外的值,这个值的引用减一

      当引用次数为0时,说明没办法访问这个值,因而就可以将其占用的内存空间回收。

      引用计数的问题:循环引用

      

    function cricle(){
         var objA = new Object();
         var objB = new Object();
    
         objA.someObj = objB;
         objB.someObj = objA;   
    }    
    //这个例子中objA和objB通过属性相互引用,引用次数都是2,函数执行完后他们的引用次数永远都不会是0,将无法回收。IE中的一部分对象是com,采用的引用计数的回收机制。
    
    为了避免循环引用问题,可以手动消除循环引用
    函数执行完后:
         objA.someObj = null;
         objB.someObj = null;   
    切断了与之前引用值之间连接,下次垃圾收集器就会删除这些值回收内存。

      管理内存:

        通常浏览器的可用内存是比分配给桌面应用程序少的,为提升性能一般只为执行代码保存必要的数据,一旦数据不再用,最后通过将其置为null,来释放器引用,即解除引用。

    function createPerson(name){
         var localPerson = new Object();
         localPerson.name = name;
         
         return localPerson;       
    }
    
    var globalPerson = createPerson("yangxunwu");
    
    执行代码段。。。
    
    手动解除引用。
    globalPerson = null;

      createPerson()创建了全局变量globalPerson后,当不再使用这个数据时手动解除引用,等待下次垃圾收集器运行时回收,而不是立即回收。

      小结:

      javascript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自一下5种基本数据类型:Undefined、Null、Boolean、String、Number。引用类型如Object的各种实例。

    1. 基本类型在内存中占固定大小空间,因此会保存在栈内存中
    2. 从一个变量向另一个变量复制基本类型的值时,会创建这个值副本
    3. 引用类型的值是对象,保存在堆内存中,引用类型的值是指向对象的指针。
    4. 从一个变量向另一个变量复制引用类型的值,复制的是指针,因而两个变量都指向同一个对象
    5. 确定一个值是哪个基本类型可以使用,typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符

      javascript具有自动垃圾收集机制的编程语言,开发人员不必关系内存的分配和回收问题。

    1. 离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
    2. “标记清除”是目前主要的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,以后在回收。
    3. 另一种是“引用计数”,跟踪所以值被引用的次数,可能会导致循环引用的问题。
    4. 解除变量的引用有助于消除循环引用的问题,而且对垃圾收集也有好处,为确保有效的回收内存,应该及时消除不再使用的全局对象、全局对象属性和循环引用变量的引用
  • 相关阅读:
    windows下查看多个tomcat对应的进程信息以及对应的程序路径
    MySQL慢查询分析工具pt-query-digest
    AR贷项通知单核销标准发票
    SFTP上传下载
    Oracle EBS标准错误信息追踪(Debug)
    Oracle EBS 初始化用户密码
    ERP通过JAVA流的形式将数据传到外围系统
    ERP解析外围系统json数据格式
    WIP*更新生产批详细信息行产品配料
    AR*客户地点分配OU
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/4772839.html
Copyright © 2020-2023  润新知