1,javascript具有自动的垃圾回收机制,自动内存的分配和无用内存的回收都可以自动管理。垃圾回收器周期性的执行;

2,Javascript的垃圾回收策略分为:引用计数和标记清除;
2.1 标记清除:根据变量是否进入环境和离开环境,来判断此变量的标记,如果离开“环境”,则将其的标记更新为“离开环境”,等到下次垃圾回收器执行垃圾回收的时候,对这些已经打上“离开环境”标记的变量执行回收操作,回收其内存。(主流)
2.2 引用计数:跟踪变量被引用的次数,当申明一个变量并引用类型值赋给变量时,引用次数+1,每次把该变量赋值给另一个变量的时候,引用计数+1,以此类推;相反,如果包含对这个值引用的变量有获得另外一个值时,引用次数-1,以此类推,当该变量的引用计数等于0时,则说明该变量已经没有变量引用,垃圾回收器下次执行的时候,就会回收该变量,释放该变量所占的内存空间。(注意:引用计数存在一个严重的问题:循环引用。对象 A 中包含一个指向对象 B 的指针,而对象 B 中也包含一个指向对象 A 的引用。)
  1. var objectA = new Object();
  2. var objectB = new Object();
  3. objectA.someOtherObject = objectB;
  4. objectB.anotherObject = objectA;
IE 中有一部分对象并不是原生 JavaScript 对象。例如,其 BOM 和 DOM 中的对象就是使用 C++以 COM( Component Object Model,组件对象模型)对象的形式实现的,而 COM 对象的垃圾收集机制采用的就是引用计数策略。因此,即使 IE 的 JavaScript 引擎是使用标记清除策略来实现的,但JavaScript 访问的 COM 对象依然是基于引用计数策略的。换句话说,只要在 IE 中涉及 COM 对象,就会存在循环引用的问题。 IE9 把 BOM 和 DOM 对象都转换成了真正的 JavaScript 对象。这样,就避免了两种垃圾收集算法并存导致的问题,也消除了常见的内存泄漏现象。(节选于《Javascript高级程序设计》(第3版))
垃圾收集器是周期性运行的,而且如果为变量分配的内存数量很可观,那么回收工作量也是相当大的。在这种情况下,确定垃圾收集的时间间隔是一个非常重要的问题。说到垃圾收集器多长时间运行一次,不禁让人联想到 IE 因此而声名狼藉的性能问题。 IE 的垃圾收集器是根据内存分配量运行的,具体一点说就是 256 个变量、 4096 个对象(或数组)字面量和数组元素(slot)或者 64KB 的字符串。达到上述任何一个临界值,垃圾收集器就会运行。这种实现方式的问题在于,如果一个脚本中包含那么多变量,那么该脚本很可能会在其生命周期中一直保有那么多的变量。而这样一来,垃圾收集器就不得不频繁地运行。结果,由此引发的严重性能问题促使 IE7 重写了其垃圾收集例程。随着 IE7 的发布,其 JavaScript 引擎的垃圾收集例程改变了工作方式:触发垃圾收集的变量分配、字面量和(或)数组元素的临界值被调整为动态修正。 IE7 中的各项临界值在初始时与 IE6 相等。如果垃圾收集例程回收的内存分配量低于 15%,则变量、字面量和(或)数组元素的临界值就会加倍。如果例程回收了 85%的内存分配量,则将各种临界值重置回默认值。这一看似简单的调整,极大地提升了 IE在运行包含大量JavaScript 的页面时的性能。(节选于《Javascript高级程序设计》(第3版))
3,管理内存
Javascript分配给web浏览器的可用内存数量通常要比分配给桌面应用程序的少,这样做的目的主要是出于安全方面的考虑,目的是防止运行 JavaScript 的网页耗尽全部系统内存而导致系统崩溃。内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句数量。因此,确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为 null 来释放其引用——这个做法叫做解除引用( dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在

它们离开执行环境时自动被解除引用。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。(节选于《Javascript高级程序设计》(第3版))

Javascript垃圾回收机制(学习笔记)的更多相关文章

  1. JavaScript 垃圾回收机制分析

    同C# .Java一样可以手工调用垃圾回收程序,但是由于其消耗大量资源,而且手工调用的不会比浏览器判断的准确,所以不推荐手工调用垃圾回收.   最近精力主要用在了Web 开发上,读了一下<Jav ...

  2. Javascript 垃圾回收机制

    转载于https://www.cnblogs.com/zhwl/p/4664604.html 一.垃圾回收的必要性 由于字符串.对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储 ...

  3. 浅谈 JavaScript 垃圾回收机制

    github 获取更多资源 https://github.com/ChenMingK/WebKnowledges-Notes 在线阅读:https://www.kancloud.cn/chenmk/w ...

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

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 垃圾回收机制的原理是找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大,所 ...

  5. 简单梳理JavaScript垃圾回收机制

    JavaScript具有自动垃圾回收机制,即执行环境会负责管理代码执行过程中使用地内存. 这种垃圾回收机制的原理很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时 ...

  6. java垃圾回收机制学习总结

    最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...

  7. python的内存管理与垃圾回收机制学习

    一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对 ...

  8. 对JavaScript垃圾回收机制的理解?

    (1)标记清除(Mark and sweep) 这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为”进入环境”,当变量离开环境的时候( ...

  9. javascript垃圾回收机制

    js中垃圾回收的算法一般包括两种,一种是“清除标记”,另一种是“引用计数”,现在较为流行的是第一种. “引用计数”现在基本已经被抛弃,主要原因是会导致循环引用,从而导致严重的问题(ie9之前的版本DO ...

随机推荐

  1. Google Dapper-大规模分布式系统的基础跟踪设施

    [说明:本文是阅读Google论文"Dapper, a Large-Scale Distributed Systems Tracing Infrastructure"之后的一个简要 ...

  2. case when

    SELECT * FROM  category  WHERE EXISTS (SELECT * FROM goods WHERE goods.cat_id = category.cat_id) cat ...

  3. PHP MVC简单介绍,对PHP当前主流的MVC做了一个总结

    东抄西抄,对PHP当前主流的MVC做了一个总结PPT. 希望对初学者有点帮助! PHP MVC初步.ppt

  4. 3、SSH高级服务

    1.ssh服务生成新的公钥和私钥[root@rhel6_80 ~]# ssh-keygen Generating public/private rsa key pair. Enter file in ...

  5. IOS自定义表格UITableViewCell

    在UITableView中,自定义表格,最原始是继承UITableViewCell,然后通过写代码方式去搞,但是这个费事了. 1.在storyboard中 给一个ViewController的tabi ...

  6. java编译后字节码解析

    java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260

  7. lucene 内存索引 和文件索引 合并

    IndexWriter.addIndexes(ramDirectory); http://blog.csdn.net/qq_28042463/article/details/51538283 在luc ...

  8. PD脚本导出到数据库后没有注释问题

    昨天PD里建了几张表,建表的时候我在NAME栏位写了中文说明,但是脚本在数据库里生成表以后,发现中文说明没有了,需要自己在“注释”栏位添加才行,如下图: 我想要达到的效果如下图: 解决方法: 1.  ...

  9. IIS 7 中设置文件上传大小的方法

    在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...

  10. ORACLE插入DATE类型字段

    1 怎样在ORACLE中输入DATE类型的字段 insert into table_name (date_column) values(to_date('2006-06-04','yyyy-mm-dd ...