垃圾回收机制

JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

var a = 'before'
var b = 'override a'
var a = b // 重写a

这段代码运行之后,“before”这个字符串失去了引用(之前是被a引用),系统检测到这个事实之后,就会释放该字符串的存储空间以便这些空间可以被再利用。

变量的生命周期

当一个变量的生命周期结束之后它所指向的内存就应该被释放。JS有两种变量,全局变量和在函数中产生的局部变量。局部变量的生命周期在函数执行过后就结束了,此时便可将它引用的内存释放(即垃圾回收),但全局变量生命周期会持续到浏览器关闭页面

现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。

标记清除

这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。

引用计数

另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。

存在问题:

function problem() {var objA = new Object();var objB = new Object();objA.someOtherObject = objB;objB.anotherObject = objA;
}

在这个例子中,objA和objB通过各自的属性相互引用;也就是说这两个对象的引用次数都是2。在采用引用计数的策略中,由于函数执行之后,这两个对象都离开了作用域,函数执行完成之后,objA和objB还将会继续存在,因为他们的引用次数永远不会是0。这样的相互引用如果说很大量的存在就会导致大量的内存泄露。

IE中有一部分对象并不是原生JavaScript对象。例如,其BOM和DOM中的对象就是使用C++以COM(Component Object 
Model,组件对象)对象的形式实现的,而COM对象的垃圾回收器就是采用的引用计数的策略。因此,即使IE的Javascript引擎使用标记清除的策略来实现的,但JavaScript访问的COM对象依然是基于引用计数的策略的。说白了,只要IE中涉及COM对象,就会存在循环引用的问题。看看下面的这个简单的例子:

var element = document.getElementById("some_element");
var myObj =new Object();
myObj.element = element;
element.someObject = myObj;

上面这个例子中,在一个DOM元素(element)与一个原生JavaScript对象(myObj)之间建立了循环引用。其中,变量myObj有一个名为element的属性指向element;而变量element有一个名为someObject的属性回指到myObj。由于循环引用,即使将例子中的DOM从页面中移除,内存也永远不会回收。
        
  不过上面的问题也不是不能解决,我们可以手动切断他们的循环引用。

myObj.element = null;
element.someObject =null;

这样写代码的话就可以解决循环引用的问题了,也就防止了内存泄露的问题。

详解JavaScript垃圾回收机制相关推荐

  1. python多线程详解 Python 垃圾回收机制

    文章目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 总结起来,使用多线程编程具有如下几个优点: 二.线程实现 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 ...

  2. Java Garbage Collection基础详解------Java 垃圾回收机制技术详解

    最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面试官问的时候也不存在问题,直到那天该公司一个做搜索的面试官问了我GC的问题,具体就是:老年代使用的是哪中垃圾 ...

  3. 详解Python垃圾回收机制

    引用计数 Python默认的垃圾收集机制是"引用计数",每个对象维护了一个ob_ref字段.它的优点是机制简单,当新的引用指向该对象时,引用计数加1,当一个对象的引用被销毁时减1, ...

  4. JavaScript 垃圾回收机制

    目录 一.javascript垃圾回收机制 标记清除 引用计数 二.减少JavaScript中的垃圾回收 对象优化 数组优化 函数优化 高级技术 一.javascript垃圾回收机制 解决内存的泄露, ...

  5. javascript垃圾回收机制原理:

    javascript垃圾回收机制原理: 解决内存的泄露,垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存. 通常采用的垃圾回收机制有两种方法:标记清除,引用计数. 标记清除: ...

  6. javascript 垃圾回收机制--分代式垃圾回收机制

    以前对 javascript 的垃圾回收机制没有深入了解过.以为只是简单的标记清除法.即从根对象开始找它的引用,然后依次往后找它引用的引用,依次递归,将所有被引用的变量打上标记.然后在遍历完后,清除没 ...

  7. JavaScript——垃圾回收机制

    目录 一.前言 二.内存泄漏 三 .垃圾回收机制概述 四.垃圾回收方法 1.标记清除 2.引用计数 一.前言 我们学过的大多数语言都是提供自动内存管理机制也即垃圾回收机制的,比如C#.Java.Jav ...

  8. JavaScript垃圾回收机制理解

    JS的内存的生命周期: 1- JS运行程序 分配你所需要的暂时使用内存大小. 2- JS运行程序 在每次创建字符串.对象的时候,程序都会分配新内存来存储那个实体. 3- JS运行程序 对于不需要使用的 ...

  9. javascript垃圾回收机制是什么

    1.js的数据(字符串.数组.对象)没有固定的大小,js程序在创建这些数据之后这些数据才会被分配内存,所以js的内存分配是动态的,如果一直只分配不回收那么内存被消耗完程序就会崩溃. 2.这就是js需要 ...

最新文章

  1. Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b
  2. 查看 Eigen库 linux系统的版本
  3. Hbase源码分析:Hbase UI中Requests Per Second的具体含义
  4. 存款人在哪些情况下应向开户银行提出撤销银行结算账户的申请?
  5. Java程序员须知:分布式微服务为什么很难?
  6. ORACLE——重做日志文件管理
  7. Vue.js过滤器概述
  8. 解决:A component required a bean of type ‘javax.jms.Queue‘ that could not be found.
  9. JVM虚拟机-Class文件之字段表集合
  10. labelimg如何调整框的颜色_新手如何快速做字幕?
  11. 测试自己幸运数字的软件,心理测试:4个数字哪个是你的幸运数字?测试你的心理年龄!...
  12. Exchange2007服务器角色
  13. oracle 9i故障恢复,Oracle9i rman备份恢复总结
  14. ubuntu 双网卡内外网优先级设置
  15. for能否作为matlab的变量名,matlab中for语句用法
  16. GSM、TD-SCDMA、WCDMA、LTE
  17. 怎么还原计算机字体库,电脑字体怎么恢复默认设置
  18. 【 直接复制不用下载 】-- 走遍美国总词汇(完整版)
  19. 阿里巴巴集团副总裁陈丽娟对话VMware全球副总裁原欣:助力企业数字化转型
  20. 蓝牙耳机的音质真的很差吗?2021商城高人气蓝牙耳机测评

热门文章

  1. ebnf范式_(4条消息)扩展巴科斯范式(EBNF)简介
  2. 女儿看到爸爸与别的女人上了床
  3. 谈谈对中文乱码,编码的理解 java python
  4. python中complex函数的用法_​Python中complex函数有什么用
  5. spring初识--bean的几种注册方式
  6. excel动态表单导出
  7. 捞点大厂产品经理(合作企业招聘),没年龄限制~~~
  8. 如何使用腾讯会议录屏?腾讯会议不允许录屏怎么办?这个方法教你解决
  9. Qt QSplitter拆分器
  10. 剑灵力士卡刀ahk_关于暗枪卡刀AHK我研究了2个小时。感觉完美。