因为字符串、对象和数组没有固定的大小,所以只有在知道动态存储分配的大小时才能执行。每次JavaScript程序创建字符串、数组或对象时,解释器必须分配内存来存储该实体。只要像这样动态地分配内存,它最终将被释放以便可以重用,否则JavaScript解释器将消耗系统中的所有可用内存并导致系统崩溃。

这篇文章解释了为什么系统需要垃圾收集。与C/C++不同,JS有自己的垃圾收集机制。javascript解释器可以检测程序何时不再使用对象。当他确定一个物体是无用的时,他知道它不再需要了,可以释放它所占据的记忆。例如:

var a=之前;
var b=覆盖a;
var a=b;//重写a
运行此代码后,“before”字符串将丢失其引用(以前由a引用)。当系统检测到这个事实时,它会释放字符串的存储空间,以便可以重用。

二。垃圾回收利用原理分析

现在,主要浏览器通常使用两种垃圾收集方法:标签清除和引用计数。

1。标记间隙

这是JavaScript中最常见的垃圾收集方式。当变量进入执行环境时,它被标记为入口环境。从逻辑上讲,进入环境的变量永远无法从内存中释放,因为只要执行流进入相应的环境,就可以使用它们。当变量离开环境时,它被标记为“离开环境”。
当垃圾收集器运行时,它标记存储在内存中的所有变量。然后,它删除环境中的变量和环境中变量引用的标记。之后标记的变量被视为准备删除,因为环境中的变量不再可访问。最后。垃圾收集器执行内存清理、销毁标记值并回收它们占用的内存。

对于这一部分,我建议阅读汤姆叔叔的文章,详细解释一些关于范围链的知识。在阅读之后,您几乎可以知道哪些变量将被标记。

2。参考计数

另一种不太常见的垃圾收集策略是引用计数。引用计数意味着跟踪每个值被引用的次数。当变量被声明并且引用类型被分配给该变量时,对该值的引用数为1。相反,如果包含对该值的引用的变量生成另一个值,则对该值的引用数将减少1。当引用数为零时,意味着无法再次访问该值,因此可以恢复它所占用的内存空间。这样,下次垃圾收集器运行时,它将释放具有零引用的值所占用的内存。

但是这个方法有问题。让我们看看下面的代码。

复制代码
函数问题()。{
var obja=新对象();
var objb=新对象();

obja.someOtherObject=objb;
objb.anotherObject=obja;
}
复制代码
在本例中,obja和objb通过各自的属性相互引用;垃圾分类也就是说,对两个对象的引用数为2。在使用引用计数策略中,由于两个对象在函数执行后都离开作用域,因此在函数执行后,obja和objb将继续存在,因为它们的引用数永远不会为零。如果大量存在这样的交叉引用,可能会导致大量内存泄漏。

我们知道IE中的一些对象不是本机JavaScript对象。例如,它们的BOM和DOM中的对象使用C++到COM(组件对象)。
模型(组件对象)以对象的形式实现,COM对象的垃圾收集器是引用计数策略。因此,即使IE的javascript引擎实现了标记清除,javascript还是基于引用计数策略访问COM对象。坦率地说,只要COM对象涉及到IE,就存在循环引用的问题。请看下面的简单示例:

var元素=文档。getElementByID(“some_element”);
var myobj=新对象();
MYOBJ.元素=元素;
元素。someObject=myobj;
在上面的示例中,在dom元素和本机javascript对象(myobj)之间建立循环引用。其中,变量myobj有一个名为element的属性指向元素,而变量元素有一个名为someobject的属性指向myobj。由于循环引用,即使从页面中删除示例中的DOM,也不会回收内存。

但是,上述问题并不能解决,我们可以手动切断它们的循环引用。

MYOBJ.元素=空;
元素。someObject=空;
这样,T

转载于:https://www.cnblogs.com/blogst/p/10979849.html

javascript垃圾回收机制相关推荐

  1. JavaScript 垃圾回收机制

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

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

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

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

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

  4. JavaScript——垃圾回收机制

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

  5. 详解JavaScript垃圾回收机制

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

  6. JavaScript垃圾回收机制理解

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

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

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

  8. JS闭包的简单理解。优缺点以及垃圾回收机制

    闭包是什么? ·了解闭包首先了解js的'链式作用域'结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...

  9. javascript的垃圾回收机制

    一.垃圾回收的必要性 下面这段话引自<JavaScript权威指南(第四版)> 由于字符串.对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配.JavaScrip ...

最新文章

  1. DropdownList绑定的两种方法
  2. 每日一皮:一个名字打败对手的经典案例...
  3. python的实例属性和静态属性表_Python:类属性,实例属性,私有属性与静态方法,类方法,实例方法...
  4. 前端笔记-Vue中缺少router-view导致跳转失效
  5. Windows下安装MySQL5.7流程
  6. nowcoderG 小国的复仇
  7. 浅谈CDN技术的性能与优势
  8. mysql身份证校验码_通过SQL校验身份证号码是否正确
  9. SPSS基础数据操作之变量的计算及个案计数
  10. 信息系统项目管理师(第1章)
  11. 金融管理系统测试报告(内部测试案例)
  12. CheckForIllegalCrossThreadCalls = false
  13. 数据分析两场NBA比赛结果!大数据+NBA=?
  14. Python游戏之Pygame——太空飞机大战(三)
  15. 微信小程序订阅消息功能
  16. 运营都会写分析报告了!数据分析该怎么办?
  17. 申请域名绑定IP开通80端口记录
  18. Pr找不到msvcp110. dll问题
  19. 蓝桥ROS机器人课程总结2022
  20. 技术面试问题汇总第007篇:腾讯管家反病毒工程师-电话二面

热门文章

  1. 内置对象 API Math对象、Data对象、Array对象、String对象
  2. 【MYSQL快速入门】常用函数:日期函数
  3. LIRe提供的图像检索算法的速度
  4. python发送微信消息_python 发送QQ或者微信消息
  5. android togglebutton 自定义,自定义控件之-----ToggleButton
  6. idea 使用神坑之索引篇(自定义不创建索引文件夹)
  7. meta refresh 刷新
  8. https请求 nginx 不生效_nginx设置https后无法打开网页
  9. 【PAT】2021年冬季考试甲级,摸鱼游记、92分
  10. 第六章节 三层架构(二. 模型层与数据访问层)