关于javascript的垃圾回收问题

  每次都听的各种大神回来的面经,总是会提到xxx的垃圾回收,xxx的内存回收,读了《javascript高级程序设计》,对javascript的垃圾回收机制有了个大致的了解,写在这里了就。

                            javascript的垃圾回收机制

在编写javascript程序的时候,程序员不需要再关心内存的使用问题,因为javascript具有自动垃圾回收机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。

javascript的垃圾回收机制很简单,就是找出不再使用的变量,释放掉他的内存。因为开销比较大,这个过程不是每时每刻都在进行,所以垃圾回收器会按照一定的周期进行操作。

(不再使用的变量就是生命周期结束的变量,这里的变量不包括全局变量,因为全局变量只有在浏览器关闭或者是页面关闭的时候才会被删除)

垃圾回收器将每个变量打上标记,当标记为“无用”的时候,就会对他进行清楚,用于标记无用的策略有很多,常用的为以下两种:

1_标记清除(最常用)

当变量进入环境,比如声明一个变量的时候,就酱这个变量标记为“进入环境”。从逻辑上讲,用于不能释放标记为“进入环境”的变量的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,将其标记为“离开环境”。

垃圾回收器在运行的时候会给存储在内存的所有变量都加上标记(可以以任何的标记方式),然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而再次之后呗加上标记的变量将被视为是准备删除的变量,因为环境中的变量已经无法访问到这些变量了。最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。

IE,Firefox,Opera,Chrome的javascript实现使用的都是这种方法。

2_引用计数(几乎已放弃)

--->跟踪每个值被引用的次数

当声明了ige变量并将一个引用类型值赋给该变量的时候,这个值的引用次数为1,如果同一个值又被赋给了另外一个变量,那么他的引用次数就+1,相反,如果包含这个值引用的变量获得了另外一个值,初始的那个值就相当于拜拜了,引用次数-1,当引用次数变为0的时候,就说明不能访问这个值了,就回收内存空间。

function dby(){

obj1 = new Object();

obj2 = new Object();

obj1.attribute = obj2;

obj2.attribute = obj1;

}

上述例子中,obj1和obj2都通过各自的属性相互引用,所以这两个对象的引用次数都是2,采用计数的方法判定回收的话,他们的引用次数都不可能为0,即不能回收,这就出现了问题,而且如果这个函数被重复调用,事情会变得更加复杂,所以计数方法来判定回收与否不如上述的标记清除方法。

P_78

DA_Again_一年苦行僧

时间: 2024-11-04 23:07:51

关于javascript的垃圾回收问题的相关文章

JavaScript 之垃圾回收和内存管理

JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源. 在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理.这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间

JavaScript 的垃圾回收与内存泄露

JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手动释放无用内存. 在这之前先说一下垃圾回收的两种方式:引用计数与标记清除. 引用计数方式会为每个已分配内存单元设置计数器,当计数器减少到0的时候就意味着该单元无法再被引用,将会被清除. 有一个问题是,当存在循环引用时,内存单元的计数器将永远不为0,内存的释放会比较复杂(需要使用到弱引用). 1 obj.val = obj2; 2 obj2.val = obj; 标记清除方

Nodejs通过Thrift操作hbase卡住原因分析及与javascript的垃圾回收机制的关系

在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进不到hbase下取数据,出现socket hang up的错误,查了很多资料也没解决.当时认为是hbase的并发数问题,其并发数的限制导致了资源负载的极限,后来不断测试找到原因所在,其实与hbase处理并发的能力无关,真正的原因是jsvascript的垃圾回收机制使得资源使用达到瓶颈,下面是代码处理

160930、Javascript的垃圾回收机制与内存管理

一.垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存. JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行. 不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生

浅析JavaScript的垃圾回收机制

JavaScript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation).通常我们使用new创建对象,GC负责回收对象占用内存区域.因此了解GC,可以加深对javascript垃圾回收机制的理解.惠民县宿哲服装 GC在回收内存时,首先会判断该对象是否被其它对象引用.在确定没有其它对象引用便释放该对象内存区域.因此如何确定对象不再被引用是GC的关键所在. <script type=&qu

javascript的垃圾回收机制和内存管理

垃圾回收 javascript不同于c.c++的一个特点是:具有自动的垃圾回收机制,这就意味着,开发人员可以专注于业务,而不必把过多精力放在内存的管理上,提高开发效率. 所谓的垃圾回收就是找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作. 目前在浏览器中,实现垃圾回收的方式主要有两种:1.标记清除也是javascript最常用的垃圾回收的方式.在标记清除的方式中有两个概念:『进入环境』和『离开环境』.『进入

JavaScript的垃圾回收机制与内存泄漏

常用的两种算法: 引用计数(新版浏览器已弃用,弃用原因:会出现循环引用的情况,无法进行垃圾回收,导致内存泄漏) 标记清除 引用计数法 引用计数,顾名思义一个对象是否有指向它的引用,即看栈中是否有指向要释放的该块堆内存中的地址,如果没有,则该块内存是不需要的,可以进行释放,即垃圾回收 下面引用大佬的一个简短例子来说明情况 1 // 创建一个对象person,他有两个指向属性age和name的引用 2 var person = { 3 age: 12, 4 name: 'aaaa' 5 }; 6 ?

Javascript的垃圾回收机制

在js中,所需内存的分配以及无用内存的回收完全实现了自动管理.垃圾收集机制原理:找出那些不再使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性的执行这一操作垃圾收集的方式有两种:标记清除法和引用计数法. 标记清除法:给存储在内存中的所有变量添加标记,去除掉环境中的变量以及被环境中的变量引用的变量的标记,剩下的带标记的就是准备删除的变量,这是一种比较常用的方法,大多数浏览器中采用的都是这种方法. 引用计数法:声明一个变量,将一个引用类型的值赋值给该

JavaScript中的的垃圾回收机制

JavaScript中的的垃圾回收机制 javascript的垃圾回收原理 (1).在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收: (2).如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收.