2019独角兽企业重金招聘Python工程师标准>>>

JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手动释放无用内存。

在这之前先说一下垃圾回收的两种方式:引用计数标记清除

    引用计数方式会为每个已分配内存单元设置计数器,当计数器减少到0的时候就意味着该单元无法再被引用,将会被清除。

有一个问题是,当存在循环引用时,内存单元的计数器将永远不为0,内存的释放会比较复杂(需要使用到弱引用)。

obj.val = obj2;
obj2.val = obj;

    标记清除方式维护一条链表,当变量进入scope时被加入这条链表,移出scope时被从链表剔除。当gc被激活时,首先为每个变量打上一个标记,然后清除存在于那条链表的变量的标记以及变量引用的成员的标记。最后,不再使用到的变量仍旧被gc标记着,将被释放,包括循环引用。

如果一段不再使用的内存未得到回收,将导致内存泄露, 它将一直占据着内存而无法被利用,可能造成系统运行缓慢,浏览器崩溃等问题。

关于浏览器的javascript实现使用哪种回收机制,众说纷纭,感觉贵圈好乱。

我google了一下,http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa 提到IE以及火狐都使用引用计数的机制回收DOM对象, http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx 说JScript采用 nongenerational mark-and-sweep garbage collector(一种标记清除),还有资料提到现代浏览器都使用标记清除回收javascript垃圾。

总结为,浏览器回收JavaScript内存采用标记清除,使用引用计数回收宿主对象(如Dom、Bom、ActiveX Object)。

根据我在IE上做的测试,javascript对象间的循环引用不会引发内存泄露。

setInterval(function(){for(var i = 0; i < 100000; i++){var obj = {}, obj2 = {};obj.val = obj2;obj2.val = obj;}
}, 10);

内存使用呈周期性变化,一直稳定,看来不用担心javascript对象的循环引用问题。

既然Dom采用引用计数回收内存,那是否存在内存泄露问题?

var nodeHold = [],interval = setInterval(function(){for(var i = 0, length = 1000; i < length; i++){var node = document.createElement("div"),obj = {};node.val = obj;obj.val = node;document.body.appendChild(node);document.body.removeChild(node);}}, 500);

在IE7与IE8上,内存直线上升。

与 http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx 所称一致,原因是javascript的垃圾回收管不了Dom对象,且Dom使用引用计数回收方式,导致循环引用无法回收。前提是Dom必须先加到文档树再删除(我猜测是为真正的Dom对象分配内存,而这不属于javascript)。

要注意的是,IE9+并不存在循环引用导致Dom内存泄露问题,可能是微软做了优化,或者Dom的回收方式已经改变。

转载于:https://my.oschina.net/cbRenfloql/blog/280404

JavaScript 的垃圾回收与内存泄露相关推荐

  1. 闭包,作用域链,垃圾回收,内存泄露

    关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (- o -)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另 ...

  2. JavaScript 中的垃圾回收和内存泄露如何处理?| 技术头条

    作者 | 浪里行舟 责编 | 郭芮 程序的运行需要内存.只要程序提出要求,操作系统或者运行时就必须供给内存.所谓的内存泄漏简单来说是不再用到的内存,没有及时释放.为了更好避免内存泄漏,我们先介绍Jav ...

  3. 【转】JavaScript 中的垃圾回收和内存泄露如何处理

    转自 https://blog.csdn.net/csdnnews/article/details/89596750?ops_request_misc=%257B%2522request%255Fid ...

  4. js的垃圾回收和内存泄露

    垃圾回收机制 浏览器的 Javascript 具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.其原理是:垃圾收集器会定期(周 ...

  5. flash垃圾回收和内存泄露

    GC的原子模型 之所以用"原子模型"(Atomic Model)这个词,是因为这篇文章是用来描述GC怎么样在 player中工作的模型,但是不包涵其相关的技术实现或细节描述. 之所 ...

  6. Python垃圾回收与内存泄露

    Python是面向对象.高级编程语言,其世界里万物皆对象,当我们编写的程序运行时,代码中定义的对象在物理内存中会占用相应的空间.现在流行的高级语言如Java,C#等都采用了垃圾收集机制自动管理内存使用 ...

  7. js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

    js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...

  8. javascript的垃圾回收机制指的是什么?

    javascript的垃圾回收机制指的是什么?你了解吗?本文小编给大家详细解读一下! 定义:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束. 像 C 这样的编程语言,具有低级内存管理原语 ...

  9. .NET深入学习笔记(3):垃圾回收与内存管理

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

最新文章

  1. SAP MM 某项目上产品层次的设计
  2. windows7 下 安装ipython-5.1.0报错
  3. HTML5——FileReader详解
  4. 贝叶斯推断及其互联网应用(二):过滤垃圾邮件
  5. linux 防火墙iptables简明教程
  6. Linux程序开机启动
  7. ChoiceFormat:数字范围格式
  8. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
  9. Kotlin开发团队惹上麻烦了
  10. 2021-06-18激活函数的意义
  11. SQL Server使用convert对datetime日期数据进行获取
  12. angular2-动画
  13. 烂漫的青春后期 35岁前必须做好十件事情[转载]
  14. CodeForces - 988D(思维STL)
  15. 不同文件格式打开的方法
  16. 《可穿戴创意设计:技术与时尚的融合》一一2.4 超级英雄和超级可穿戴设备...
  17. 信息安全技术——(十五)物联网关键技术
  18. 阿里云服务器 API 的使用
  19. 【其他】神舟精盾K470-i3 D3更换支持5GHz的双频无线网卡
  20. 嵌入式硬件(一)概述

热门文章

  1. linux1.0内核下载,《Linux 0.01 内核分析与操作系统设计》(Linxu 0.01Source)
  2. 全麦吐司和普通吐司的区别_全麦面包和普通面包的区别
  3. 335b装配程序流程图_某建设项目装配式框架结构PC构件吊装监理细则(方案)
  4. nodejs html转excel,Node.js excel sheetjs/js-xlsx
  5. 5首页加载慢_5个 外贸建站谷歌SEO优化技巧
  6. 基于ESP8266 WiFi控制的步进升降机械平台
  7. 更新linux内核版本,求问Linux最新内核版本以及发布日期。
  8. python django 优势_那么多人选择Python,它的优势,缺点有哪些?
  9. 圆周率一千万亿位_圆周率已经到了十万亿位了,为什么还要计算下去?有什么意义吗?...
  10. outlook正在与服务器联系以获取信息,Outlook 2016点击邮件显示正在与服务器联系以获取信息...