JS 垃圾收集

JS具有自动垃圾收集机制;也就是说,执行环境会管理代码执行过程中使用的内存。

一、局部变量的生命周期

局部变量只在函数执行过程中存在。

在这个过程中,会为局部变量在栈(或堆)内存上分配相应的空间,以便存储它们的值。然后在函数中使用这些变量,直到函数执行结束;然后释放内存。

二、标记清除

当变量进入环境,就将这个变量标记为“进入环境”;从逻辑上讲,永远不能释放进入环境的变量所占的内存;当变量离开环境时,则将其标记为“离开环境”。

三、管理内存

为执行环境中的代码保存必要的数据;一旦数据不再有用,最好通过将其设置为null,来释放其引用——这个做法叫做解除引用;这个方法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动解除引用。

解除一个值的引用并不意味着自动回收该值所占的内存;解除引用的真正作用在于,让值脱离执行环境,以便垃圾收集器下次运行时将其收回。

四、闭包与垃圾回收

作用域链是一个对象列表,不是绑定的栈;

每次调用JS函数的时候,都会为之创建一个新的对象来保存局部变量,谓之“变量对象”;把这个对象添加到作用域链中,当函数返回的时候,就从作用域链中将这个变量对象删除。

如果不存在嵌套的函数,也没有其他引用指向这个变量对象,它就会被当做垃圾回收掉。

如果定义了嵌套的函数,每个嵌套的函数都各自对应一条作用域链,并且这个作用域链指向一个变量对象。

如果这些嵌套函数对象在外部函数中保存下来,那么它们也会和所指向的变量对象一样当做垃圾回收。

但是如果这个函数定义了嵌套的函数,并将它作为值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,它就不会被当做垃圾回收,并且他所指向的变量对象也不会被当做垃圾回收。

时间: 2024-11-08 03:50:47

JS 垃圾收集的相关文章

JS垃圾收集机制

JS 具有自动垃圾回收机制,不需要像C++/C等语言去手动跟踪内存使用情况. 垃圾收集方式: 1.标记清除: 垃圾收集器在运行时给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量,以及被环境中变量引用的变量的标记.而之后被标记的变量将为准备删除的变量,原因是环境中已经无法访问到这些变量了.最后,垃圾收集器完成内存清除工作,消除那些标记的值被回收内存空间 2.引用计数,跟踪每个值被引用的次数 当声明了一个变量并将引用类型值赋给它的时候,则这个值引用次数就为1,如果同一个值又被赋给另一个

关于js基础easy忘记的那些事儿

1.Number() 通过这个函数转化后的值仅仅有两个:数值和NaN,通过parseInt也能转化为数值.可是像"134df"转化后的值为134,而Number("134df")则是NaN: 2.String() 转化成字符的方法有两种:调用toString()和String(),通过String()转化后有5种类型:字符串:"true"或者"false":null:undefined:数值. 3.逻辑非!          

JavaScript 中变量、作用域和内存问题的学习

这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScript的知识,其中有些是网络上的,不过对于理解JavaScript,和在工作总是会很实用的,所以总结了下来: 那么就开始吧,首先是变量 在JavaScript中变量分为两种:一种是基本类型,基本类型值在内存中占用固定大小的空间,因此被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的

js闭包和垃圾收集机制

1.JS的回收机制 JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行. 到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存.用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数.引用计数不太常用,标记清除较为常用. 准确来说,闭包是基于正常的垃圾回收处理机制下的.

作用域,作用域链,垃圾收集,js解析

变量中包含基本数据类型和引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象. 引用类型可以为其添加属性和方法,也可以改变和删除属性和方法. 复制变量值: 基本类型:一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,并把该值分配到新变量分配的位置上,两者任何操作不会互相影响. 引用类型:当一个变量向另一个变量复制引用类型的值时,同样也会存储在变量的值复制一份放到位新变量分配的空间中,但是不同的视,这个值的副本只是一个指针,而这个指针指向存储在堆中的一个对象,两个变量引

JS高程4.变量,作用域和内存问题(3)垃圾收集

JavaScript的自动垃圾收集机制 执行环境会负责管理代码执行过程中使用的内存,编写JavaScript程序时,所需内存的分配以及无用内存的回收完全实现自动管理. 原理: 找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作. 垃圾收集的方式: 1.标记清除(mark-and-sweep) 最常用的垃圾收集方式.当变量进入环境时,就将变量标记为"进入环境".从逻辑上讲,永远不能释放进入环境的变量所占

(转)js闭包初入门

先看一段JS代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 function a(){             var num = 0;             function b(){                 num++;                 console.log(num);             }             return b;         }         var add = a();         add();     

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...

高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前的执行环境. 二.作用域 1.每个执行环境,都对应一个自己的作用域. 2.每个执行环境,都能访问上一级的父级.父父级....作用域,称为 "作用域链" 3.执行代码时,会按照标识符沿着作用域链一级一级向上查找.如果找不到,则会报错 *标志符:执行时,使用到的变量或函数 三.上下文执行过程