js的垃圾清理机制

今天去面试,遇到了这个问题,之前是有看过想过相应资料,不过到时直接语塞了,回来翻看一些资料,总结如下:

1 原理

找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔,或是咱们在代码预订的收集时间,去周期性的执行这个操作,完成垃圾的清理。

2 局部变量的生命周期

在函数执行的过程中,才存在有局部变量,在这个过程中,浏览器引擎会为局部变量在栈或是堆内存上分配相应的空间,以便存储这些值。在函数执行结束后,局部变量就没有存在的必要了,因此可以释放它们所占用的内存以供将来使用。这种情况下回比较好判断变量有没有必要存在了,但是作用域还没有结束,当前变量还被其他地方调用了,那么垃圾收集器就得跟踪这些变量哪个有用哪个没用,做上相应的标记。

3 垃圾清理实现策略一:标记清除

当变量进入环境时,如在函数中var一个变量,此时将这个变量标记为进入环境,当变量离开环境的时候,则将其标记为离开环境,可以通过翻转某一个位来标记一个变量何时进入了环境。但标记不是重点,重点是标记了之后怎么来将其处理。垃圾收集器会在运行的时候给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量应用的标记,在此之后再把加上标记的变量都将被视为准备删除的变量。最后,垃圾收集器完成内存的清楚工作,销毁那些带标记的值并收回它们所占用的内存空间

4 垃圾清理实现策略二:引用计数

跟踪记录每个值被引用的次数,当这个值的引用次数变成0的时候,说明没有办法再访问这个这个值,就将其占用的内存空间收回来,下次再运行垃圾收集器的时候,就会释放哪些引用次数为0的值所占用的内存了。

但存在的一个问题是,如果有循环引用,即A有个指针指向B,B也有一个指针指向A,在采用标记清楚策略的实现中,这将是个噩梦。如果DOM元素和原生JS对象之间创建了循环引用,那就带来内存泄露的问题,解决方法是把DOM和BOM对象转换成真正的JS对象。

5 垃圾收集的时间间隔

原来IE的垃圾收集器的启动方式是,当内存分配量达到256个变量、4096个对象字面量和数组元素或是64kb的字符串这三者任何一个临界值时,就开始启动垃圾收集器。但一个脚本中可能会在其生命周期中一直保有那么多变量,那么垃圾收集器就得一直的去运行,那导致的性能问题是很严重的。所以后面的优化方法是:触发垃圾收集的变量分配的临界值被调整为动态修正

js的垃圾清理机制,布布扣,bubuko.com

时间: 2024-10-09 17:10:12

js的垃圾清理机制的相关文章

js的垃圾回收机制

Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记为“离开环境”.标记“离开环境”的就回收内存. 工作流程: 1.    垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记. 2.    去掉环境中的变量以及被环境中的变量引用的变量的标记. 3.    再被加上标记的会被视为准备删除的变量. 4.    垃圾回收器完成内存清除工作,销毁那

【R笔记】R的内存管理和垃圾清理

R输入命令时速度不要太快,终究是个统计软件,不是编程! 写R程序的人,相信都会遇到过“cannot allocate vector of size”或者“无法分配大小为...的矢量”这样的错误.原因很简单,基本都是产生一个大矩阵等对象时发生的,最干脆的解决办法有两种,第一种是加大内存换64位系统,第二种是改变算法避免如此大的对象.第一种办法,是最好的办法,不过大对象的需求是没有止尽的,终究不是长久之道.第二种办法是最好的思路,无论多么大的对象都是可以弄小的,无非就是分而治之.时间换空间等,对算法

浅谈垃圾回收机制

C/C++经典垃圾回收算法 1. 引用计数法: 每个对象计算指向它的指针数量 当有一个指针指向自己时数值加1 当删除一个指向自己的指针时计数减1 如果减为0,说明已经不存在指向该对象的指针了,所以可以安全销毁了. 2. 标记-清除算法 3. 标记-缩并算法 4. 节点拷贝算法 引用计数法能够平滑的进行垃圾回收,而不出现"停止"现象,经常出现于一些实时系统中,但它无法解决环形问题. 后面三种统称为跟踪垃圾回收,在每一次垃圾回收过程中,要遍历或者复制所有存活的对象,这是一个非常耗费时间和空

JS高程中的垃圾回收机制与常见内存泄露的解决方法

起因是因为想了解闭包的内存泄露机制,然后想起<js高级程序设计>中有关于垃圾回收机制的解析,之前没有很懂,过一年回头再看就懂了,写篇博客与大家分享一下. #内存的生命周期: 分配你所需要的内存: 由于字符串.对象等没有固定的大小,js程序在每次创建字符串.对象的时候,程序都会分配内存来存储那个实体. 使用分配到的内存做点什么. 不需要时将其释放回归: 在不需要字符串.对象的时候,需要释放其所占用的内存,否则将会消耗完系统中所有可用的内存,造成系统崩溃,这就是垃圾回收机制所存在的意义. 所谓的内

闭包内的微观世界和js垃圾回收机制

一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”.看下面这段代码:function a() {var i = 0;function b() { alert(++i); }return

JS学习之生命周期与垃圾回收机制

生命周期 变量或者函数在相应的作用域里存在的时间 局部变量和局部函数:不再使用就是生命周期的结束,在函数内声明,当函数执行完毕后,这个变量就不存在了 全局变量和全局函数:当声明完成以后在整个页面中都可以用,当页面关闭的时候生命周期结束 垃圾回收机制: 变量或者函数存在于内存当中,变量在使用完以后,没有在其他地方在使用就会被清除用来释放内存.垃圾回收机制会按照固定的时候周期性的执行 1 function test(){ 2 var n=10; // 在函数内声明,局部变量,在函数外面是访问不到的

js object类型转换 内存泄漏 垃圾回收机制

-------------------------------------------------------------************* - object 变量名存储在栈里面,存储的是引用地址 ,指向堆里面的对象内容数据: - 内存泄漏 + 发生条件:新对象不断创建,旧对象却不清除: 为了避免内存泄漏,有垃圾及回收机制 - 垃圾回收机制(gc) + 当对象的引用地址在栈中没有引用时,内存占比过高,垃圾回收车会将其清除. (前提:内存占比过高,object=null:如果引用对象的变量

垃圾回收机制

js中垃圾回收GC的主流方式 1,标记清除:标记内存中的全部对象,将非当前环境占用的对象标记清除, 销毁无标记对象(释放不带有标记对象占用的空间) 2,引用计数IE: 机制每当有一个引用指向当前对象,对象引用数加一,GC执行时清除引用0的对象   一个对象每增加一个引用,引用数量增加,而对象自身引用数量为零,在垃圾回收时,该对象会被销毁,或叫释放. js通常不建议程序员主动触发垃圾回收.    垃圾回收时刻,所有代码是停止执行的.为了减少程序运行停滞,通常不主动触发. 垃圾回收优化:正对垃圾回收

go的垃圾回收机制

GC垃圾回收机制: 浅析与理解 对垃圾回收进行分析前,我们先来了解一些基本概念 基本概念 内存管理:内存管理对于编程语言至关重要.汇编允许你操作所有东西,或者说要求你必须全权处理所有细节更合适.C 语言中虽然标准库函数提供一些内存管理支持,但是对于之前调用 malloc 申请的内存,还是依赖于你亲自 free 掉.从C++.Python.Swift 和 Java 开始,才在不同程度上支持内存管理. 内存压缩:对内存碎片进行压缩.(和win10的那个"内存压缩"不太一样啦) win10内